繁体   English   中英

什么是 Xcode 中的主线程检查器

[英]What is Main Thread Checker in Xcode

我检查了 Xcode 9 文档中的新内容,发现了这个

在此处输入图像描述

但我不明白我如何在新的 Xcode 9 中使用它。

它可以在方案的诊断选项中启用/禁用。 此外,“问题暂停”是调试这些问题的舒适选项。

Xcode 11 在此处输入图像描述

Xcode <11 例子

来自Apple 文档

Main Thread Checker 是一款用于 Swift 和 C 语言的独立工具,可检测 AppKit、UIKit 和后台线程上其他 API 的无效使用。 在主线程以外的线程上更新 UI 是一个常见的错误,可能会导致错过 UI 更新、视觉缺陷、数据损坏和崩溃。

因此,例如尝试在后台线程上更改UILabeltext属性将不起作用。 Apple 表示,这可能会导致错过 UI 更新、视觉缺陷、数据损坏和崩溃 实际上,99% 的时间这将导致随机错过 UI 更新和视觉缺陷(而不是崩溃)。

崩溃实际上是件好事,因为我们可以很容易地检测到UIKit的这种不当使用,但随机视觉缺陷在开发过程中很难检测到。 这就是主线程检查器的用武之地。

主线程检查器将帮助检测UIKit在后台线程上的使用,它不会解决它们 一旦检测到在后台线程上使用了UIKit ,就可以使用DispatchQueue解决它。

同样,来自Apple 文档

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 指出的那样,您还可以观看WWDC 视频以获得更详细的解释。

在 Runtime API Checking 部分下,确保启用Main Thread Checker以查看您是否在非 UI 线程中执行 ui 方法

在此处输入图像描述

在此处输入图像描述

在 XCODE-12 中转到调试然后选择方案然后编辑方案选择运行-> 诊断

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM