Что такое проверка основного потока в Xcode

Я проверил, что нового в документации по Xcode 9, и нашел это

enter image description here

Но я не понял, что это такое, как я могу использовать это с новым Xcode 9.

Ответ 1

Его можно включить/отключить в опции диагностики схемы. Кроме того, "Пауза по вопросам" является удобным вариантом для отладки этих проблем.

Пример

Ответ 2

От Документация Apple:

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 для более подробного объяснения.

Ответ 3

В разделе Проверка API Runtime убедитесь, что Main Thread Checker включен, чтобы увидеть, выполняете ли вы методы ui в потоке, отличном от UI

введите описание изображения здесь

введите описание изображения здесь