主线程检查器是Swift和C语言的独立工具,可检测后台线程上AppKit,UIKit和其他API的无效使用。在主线程以外的线程上更新UI是一个常见错误,可能导致错过UI更新,视觉缺陷,数据损坏和崩溃。
因此,例如尝试在后台线程上更改text
的UILabel
属性将不起作用。 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以获得更详细的解释。