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

问题描述 投票:11回答:3

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

enter image description here

但我不明白我如何使用新的Xcode 9。

ios swift ios12
3个回答
25
投票

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

Example


16
投票

来自Apple documentation

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

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

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

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

再次,来自Apple documentation

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


0
投票

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

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.