15

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

在此处输入图像描述

但我不明白如何将它与新的 Xcode 9 一起使用。

4

4 回答 4

35

它可以在方案的诊断选项中启用/禁用。此外,“暂停问题”是调试这些问题的舒适选项。

Xcode 11 在此处输入图像描述

Xcode <11 例子

于 2017-09-28T15:42:47.617 回答
23

苹果文档

主线程检查器是用于 Swift 和 C 语言的独立工具,可检测后台线程上 AppKit、UIKit 和其他 API 的无效使用。在主线程以外的线程上更新 UI 是一个常见错误,可能导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。

因此,例如尝试在后台线程上更改texta 的属性UILabel将不起作用。苹果表示,这可能会导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。实际上,这在 99% 的情况下会导致随机错过 UI 更新和视觉缺陷(而不是崩溃)。

崩溃实际上是好的,因为我们可以很容易地检测到这种对 . 的不当使用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在主线程上执行 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 之前你没有主线程检查器来帮助你检测问题。

正如@hamish 指出的那样,您还可以观看WWDC 视频以获得更详细的说明。

于 2017-07-06T09:23:09.107 回答
1

在 Runtime API Checking 部分下,确保启用Main Thread Checker以查看您是否在非 UI 线程中执行 ui 方法

在此处输入图像描述

在此处输入图像描述

于 2018-01-09T11:10:53.213 回答
-1

在 XCODE-12 中转到调试然后选择方案然后编辑方案选择运行-> 诊断

于 2021-07-04T23:32:32.130 回答