Xcode 中的主线程检查器是什么

What is Main Thread Checker in Xcode

我查看了 Xcode 9 文档中的新增内容,我发现了这个

但我不明白我如何将它与新的 Xcode 9.

一起使用

来自Apple documentation

The Main Thread Checker is a standalone tool for Swift and C languages that detects invalid usage of AppKit, UIKit, and other APIs on a background thread. Updating UI on a thread other than the main thread is a common mistake that can result in missed UI updates, visual defects, data corruptions, and crashes.

例如,尝试更改背景上 UILabeltext 属性 线程将不起作用。 Apple 表示,这可能会导致 错过 UI 更新、视觉缺陷、数据损坏和崩溃 。在实践中,99% 的时间这将导致 随机 错过 UI 更新和视觉缺陷(而不是崩溃)。

崩溃实际上是好的,因为我们可以很容易地检测到 UIKit 的这种不当使用,但随机视觉缺陷在开发过程中很难检测到。这就是主线程检查器的用武之地。

主线程检查器将帮助 检测 在后台线程上使用 UIKit它不会解决它们。一旦在后台线程上检测到 UIKit 的使用,您可以使用 DispatchQueue.

解决它

同样,来自Apple documentation

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在主线程上执行UI更新。

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 指出的那样,您还可以观看 the WWDC video 以获得更详细的解释。

可以在方案的诊断选项中enabled/disabled。 此外,"Pause on issues" 是调试这些问题的舒适选项。

Xcode 11

Xcode <11

在运行时 API 检查部分下,确保 主线程检查器 已启用,以查看您是否正在非运行时执行 ui 方法UI 线程

在XCODE-12 去debug 然后select Scheme 然后编辑scheme Select 运行 -> 诊断