Xcode 中的主线程检查器是什么
What is Main Thread Checker in Xcode
我查看了 Xcode 9 文档中的新增内容,我发现了这个
但我不明白我如何将它与新的 Xcode 9.
一起使用
The Main Thread Checker is a standalone tool for Swift and C languages
that detects invalid usage of AppKit, UIKit, and other APIs on a
background thread. Updating UI on a thread other than the main thread
is a common mistake that can result in missed UI updates, visual
defects, data corruptions, and crashes.
例如,尝试更改背景上 UILabel
的 text
属性
线程将不起作用。 Apple 表示,这可能会导致 错过 UI 更新、视觉缺陷、数据损坏和崩溃 。在实践中,99% 的时间这将导致 随机 错过 UI 更新和视觉缺陷(而不是崩溃)。
崩溃实际上是好的,因为我们可以很容易地检测到 UIKit
的这种不当使用,但随机视觉缺陷在开发过程中很难检测到。这就是主线程检查器的用武之地。
主线程检查器将帮助 检测 在后台线程上使用 UIKit
,它不会解决它们。一旦在后台线程上检测到 UIKit
的使用,您可以使用 DispatchQueue
.
解决它
同样,来自Apple documentation:
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 指出的那样,您还可以观看 the WWDC video 以获得更详细的解释。
可以在方案的诊断选项中enabled/disabled。
此外,"Pause on issues" 是调试这些问题的舒适选项。
Xcode 11
Xcode <11
在运行时 API 检查部分下,确保 主线程检查器 已启用,以查看您是否正在非运行时执行 ui 方法UI 线程
在XCODE-12
去debug 然后select Scheme 然后编辑scheme
Select 运行 -> 诊断
我查看了 Xcode 9 文档中的新增内容,我发现了这个
但我不明白我如何将它与新的 Xcode 9.
一起使用The Main Thread Checker is a standalone tool for Swift and C languages that detects invalid usage of AppKit, UIKit, and other APIs on a background thread. Updating UI on a thread other than the main thread is a common mistake that can result in missed UI updates, visual defects, data corruptions, and crashes.
例如,尝试更改背景上 UILabel
的 text
属性
线程将不起作用。 Apple 表示,这可能会导致 错过 UI 更新、视觉缺陷、数据损坏和崩溃 。在实践中,99% 的时间这将导致 随机 错过 UI 更新和视觉缺陷(而不是崩溃)。
崩溃实际上是好的,因为我们可以很容易地检测到 UIKit
的这种不当使用,但随机视觉缺陷在开发过程中很难检测到。这就是主线程检查器的用武之地。
主线程检查器将帮助 检测 在后台线程上使用 UIKit
,它不会解决它们。一旦在后台线程上检测到 UIKit
的使用,您可以使用 DispatchQueue
.
同样,来自Apple documentation:
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 指出的那样,您还可以观看 the WWDC video 以获得更详细的解释。
可以在方案的诊断选项中enabled/disabled。 此外,"Pause on issues" 是调试这些问题的舒适选项。
Xcode 11
Xcode <11
在运行时 API 检查部分下,确保 主线程检查器 已启用,以查看您是否正在非运行时执行 ui 方法UI 线程
在XCODE-12 去debug 然后select Scheme 然后编辑scheme Select 运行 -> 诊断