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

Kis*_*har 13 ios swift ios12

我已经检查了Xcode 9文档中的新内容,我发现了这一点

在此输入图像描述

但我不明白为什么我可以用新的Xcode 9来使用它

Saú*_*ril 28

可以在方案的诊断选项中启用/禁用它.此外,"暂停问题"是调试这些问题的一个舒适选择.

例


dea*_*eef 18

来自Apple文档:

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

因此,例如尝试更改后台线程上的text属性UILabel将无法正常工作.Apple表示,这可能导致错过UI更新,视觉缺陷,数据损坏和崩溃.在实践中,99%的时间会导致随机错过的UI更新和视觉缺陷(而不是崩溃).

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

主线程检查器将帮助dectect的用途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()
Run Code Online (Sandbox Code Playgroud)

解决方案:用于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()
Run Code Online (Sandbox Code Playgroud)

解决方案本身与Xcode无关,它是该语言的一个特性.所以很明显在Xcode的早期版本中是可能的,但在Xcode 9之前你没有主线程检查器来帮助你检测问题.

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