Я проверил, что нового в документации Xcode 9, и нашел это
Но я не понимал, что это такое, как я могу использовать это с новым Xcode 9.
Я проверил, что нового в документации Xcode 9, и нашел это
Но я не понимал, что это такое, как я могу использовать это с новым Xcode 9.
Его можно включить / отключить в опции диагностики схемы. Кроме того, «Пауза по проблемам» - удобный вариант для устранения этих проблем.
Main Thread Checker - это автономный инструмент для языков Swift и C, который обнаруживает недопустимое использование AppKit, UIKit и других API в фоновом потоке. Обновление пользовательского интерфейса в потоке, отличном от основного, является распространенной ошибкой, которая может привести к пропущенным обновлениям пользовательского интерфейса, визуальным дефектам, повреждению данных и сбоям.
Так, например, попытка изменить свойство text
объекта UILabel
в фоновом потоке не сработает. Apple утверждает, что это может привести к пропущенным обновлениям пользовательского интерфейса, визуальным дефектам, повреждению данных и сбоям. На практике в 99% случаев это приводит к случайным пропущенным обновлениям пользовательского интерфейса и визуальным дефектам (а не сбоям).
Сбои на самом деле были бы хороши, потому что мы могли бы легко обнаружить такое неправильное использование UIKit
, но случайные визуальные дефекты гораздо труднее обнаружить во время разработки. И здесь на помощь приходит средство проверки основного потока.
Средство проверки основного потока поможет определить использование UIKit
в фоновом потоке, оно не решит их. Как только вы обнаружили использование UIKit
в фоновом потоке, вы можете решить эту проблему с помощью DispatchQueue
.
Опять же, из документации Apple:
В документации URLSession
говорится, что завершение завершения будет вызываться в фоновом потоке, так что это плохо, проверка основного потока поможет вам обнаружить использование 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 у вас не было средства проверки основного потока, которое помогло бы обнаружить проблему.
Как указывает @hamish, вы также можете посмотреть видео WWDC, чтобы получить больше детальное объяснение.
В XCODE-12 перейдите к отладке, затем выберите «Схема», затем отредактируйте схему. Выберите «Выполнить» - ›Диагностика.