dea*_*eef 18
来自Apple文档:
主线程检查器是Swift和C语言的独立工具,可检测后台线程上AppKit,UIKit和其他API的无效使用.在主线程以外的线程上更新UI是一个常见错误,可能导致错过UI更新,视觉缺陷,数据损坏和崩溃.
因此,例如尝试更改后台线程上的text属性UILabel将无法正常工作.Apple表示,这可能导致错过UI更新,视觉缺陷,数据损坏和崩溃.在实践中,99%的时间会导致随机错过的UI更新和视觉缺陷(而不是崩溃).
崩溃实际上是好的,因为我们可以很容易地检测到这种不当使用UIKit,但随机视觉缺陷在开发过程中更难以检测到.这就是主线程检查器的用武之地.
主线程检查器将帮助dectect的用途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()
Run Code Online (Sandbox Code Playgroud)
解决方案:用于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()
Run Code Online (Sandbox Code Playgroud)
解决方案本身与Xcode无关,它是该语言的一个特性.所以很明显在Xcode的早期版本中是可能的,但在Xcode 9之前你没有主线程检查器来帮助你检测问题.
正如@hamish指出的那样,您还可以观看WWDC视频以获得更详细的解释.
| 归档时间: |
|
| 查看次数: |
11215 次 |
| 最近记录: |