我检查了 Xcode 9 文档中的新内容,发现了这个
但我不明白如何将它与新的 Xcode 9 一起使用。
从苹果文档:
主线程检查器是用于 Swift 和 C 语言的独立工具,可检测后台线程上 AppKit、UIKit 和其他 API 的无效使用。在主线程以外的线程上更新 UI 是一个常见错误,可能导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。
因此,例如尝试在后台线程上更改text
a 的属性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 视频以获得更详细的说明。
在 XCODE-12 中转到调试然后选择方案然后编辑方案选择运行-> 诊断