答案 0 :(得分:25)
答案 1 :(得分:16)
主线程检查器是Swift和C语言的独立工具 检测到AppKit,UIKit和其他API的无效使用情况 背景线程。在主线程以外的线程上更新UI 是一个常见的错误,可能导致错过UI更新,视觉 缺陷,数据损坏和崩溃。
例如,尝试在后台更改text
的{{1}}属性
线程不起作用。 Apple表示,这可能导致错过UI更新,视觉缺陷,数据损坏和崩溃。在实践中,99%的时间会导致随机错过UI更新和视觉缺陷(而不是崩溃)。
崩溃实际上很好,因为我们可以轻易地检测到UILabel
的这种不当使用,但在开发过程中很难检测到随机视觉缺陷。这就是主线程检查器的用武之地。
主线程检查器将帮助检测在后台线程中使用UIKit
,无法解决这些问题。在后台线程中检测到使用UIKit
后,您可以使用UIKit
解决此问题。
再次,来自Apple documentation:
DispatchQueue
的文档说明将在后台线程上调用完成闭包,所以这很糟糕,主线程检查器将帮助您检测后台线程上UIKit的使用。
URLSession
解决方案:使用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()
在主线程上执行UI更新。
DispatchQueue.main
解决方案本身与Xcode无关,它是该语言的一个特性。所以很明显在Xcode的早期版本中是可能的,但在Xcode 9之前你没有主线程检查器来帮助你检测问题。
正如@hamish指出的那样,您还可以观看the WWDC video以获得更详细的解释。
答案 2 :(得分:0)
在Runtime API Checking部分下,确保启用主线程检查器以查看您是否在非UI线程中执行ui方法
https://jersey.github.io/documentation/latest/user-guide.html
答案 3 :(得分:-1)
在 XCODE-12 中 去调试然后选择方案然后编辑方案 选择运行 -> 诊断