![](/img/trans.png)
[英]ARKit template Xcode project Main Thread Checker log console
[英]What is Main Thread Checker in Xcode
来自Apple 文档:
Main Thread Checker 是一款用于 Swift 和 C 语言的独立工具,可检测 AppKit、UIKit 和后台线程上其他 API 的无效使用。 在主线程以外的线程上更新 UI 是一个常见的错误,可能会导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。
因此,例如尝试在后台线程上更改UILabel
的text
属性将不起作用。 Apple 表示,这可能会导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。 实际上,99% 的时间这将导致随机错过 UI 更新和视觉缺陷(而不是崩溃)。
崩溃实际上是件好事,因为我们可以很容易地检测到UIKit
的这种不当使用,但随机视觉缺陷在开发过程中很难检测到。 这就是主线程检查器的用武之地。
主线程检查器将帮助检测UIKit
在后台线程上的使用,它不会解决它们。 一旦检测到在后台线程上使用了UIKit
,就可以使用DispatchQueue
解决它。
同样,来自Apple 文档:
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 指出的那样,您还可以观看WWDC 视频以获得更详细的解释。
在 XCODE-12 中转到调试然后选择方案然后编辑方案选择运行-> 诊断
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.