【发布时间】:2017-12-10 04:06:22
【问题描述】:
【问题讨论】:
-
你尝试过简单的Google search 吗?
-
没有找到任何解释清楚的解决方案
-
他们在开发者链接上提供的解决方案已经在 xcode 8 中可用,那么 xcode 9 中的新功能
【问题讨论】:
主线程检查器是 Swift 和 C 语言的独立工具 检测 AppKit、UIKit 和其他 API 的无效使用 后台线程。在主线程以外的线程上更新 UI 是一个常见的错误,可能导致错过 UI 更新、视觉 缺陷、数据损坏和崩溃。
例如,尝试在背景上更改 UILabel 的 text 属性
线程将不起作用。 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 以获得更详细的说明。
【讨论】:
【讨论】:
在 XCODE-12 中 去调试然后选择方案然后编辑方案 选择运行 -> 诊断
【讨论】: