Я проверил, что нового в документации по Xcode 9, и нашел это
Но я не понял, что это такое, как я могу использовать это с новым Xcode 9.
Я проверил, что нового в документации по Xcode 9, и нашел это
Но я не понял, что это такое, как я могу использовать это с новым Xcode 9.
Его можно включить/отключить в опции диагностики схемы. Кроме того, "Пауза по вопросам" является удобным вариантом для отладки этих проблем.
Main Thread Checker - это автономный инструмент для языков Swift и C который обнаруживает недействительное использование AppKit, UIKit и других API на фоновый поток. Обновление пользовательского интерфейса в потоке, отличном от основного потока является распространенной ошибкой, которая может привести к пропущенному обновлению пользовательского интерфейса, визуальному дефекты, сбои данных и сбои.
Так, например, попытка изменить свойство text
объекта UILabel
на фоне
нить не работает. Apple говорит, что это может привести к пропущенным обновлениям пользовательского интерфейса, визуальным дефектам, сбоям данных и сбоям. На практике 99% времени это приведет к случайным пропущенным обновлениям пользовательского интерфейса и визуальным дефектам (а не к сбоям).
Аварии на самом деле были бы хорошими, потому что мы могли легко обнаружить такое неправильное использование UIKit
, но случайные визуальные дефекты намного сложнее обнаружить во время разработки. И там, где входит Main Thread Checker.
Программа Main Thread Checker поможет использовать dectect UIKit
в фоновом потоке, не решит их. После того, как вы обнаружили использование UIKit
в фоновом потоке, вы можете решить его с помощью DispatchQueue
.
Опять же, из Документация Apple:
В документации URLSession
говорится, что закрытие завершения будет вызываться в фоновом потоке, так что это плохо, программа Main Thread Checker поможет вам определить использование UIKit в фоновом потоке.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
self.label.text = "\(data.count) bytes downloaded"
// Error: label updated on background thread
}
}
task.resume()
Решение. Используйте DispatchQueue.main
для выполнения обновлений пользовательского интерфейса в основном потоке.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
DispatchQueue.main.async { // Correct
self.label.text = "\(data.count) bytes downloaded"
}
}
}
task.resume()
Само решение не имеет ничего общего с Xcode, это особенность языка. Таким образом, очевидно, что это было возможно в предыдущих версиях Xcode, но до Xcode 9 у вас не было Main Thread Checker, чтобы помочь вам обнаружить проблему.
Как указывает @hamish, вы можете также посмотреть видео WWDC для более подробного объяснения.
В разделе Проверка API Runtime убедитесь, что Main Thread Checker включен, чтобы увидеть, выполняете ли вы методы ui в потоке, отличном от UI