【问题标题】:What is Main Thread Checker in XcodeXcode 中的主线程检查器是什么
【发布时间】:2017-12-10 04:06:22
【问题描述】:

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

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

【问题讨论】:

标签: ios swift ios12


【解决方案1】:

来自Apple documentation

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

例如,尝试在背景上更改 UILabeltext 属性 线程将不起作用。 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 以获得更详细的说明。

【讨论】:

  • 有没有办法为程序中的一个对象禁用它?它似乎在报告关于在主线程上运行的东西的废话。
  • 我也想知道是否有人知道任何 pragma clang 诊断命令来逐行禁用此警告
  • 如果您启用此工具,它将导致 UI 任务延迟执行,例如,我试图显示活动指示器,但它在一些延迟后出现,因为它在运行每个 UIKit 任务之前检查线程。此外,它没有准确检测,例如,虽然我在主线程上运行,但它仍然抱怨方法正在后台运行。
【解决方案2】:

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

Xcode 11

Xcode

【讨论】:

  • 很遗憾,Xcode 11 中没有这个选项。你知道我在哪里可以找到这个吗?
  • 我更新了 Xcode 11 的屏幕截图。唯一不同的是,暂停问题的选项消失了。
  • 您好,我正在使用 xcode 11.3 我如何在 xcode 11.3 中暂停主线程问题,请提供任何解决方案?
  • @MIOSY 我更新了 Xcode 11.3 的捕获,标记箭头按钮以添加断点。
  • 我在 Xcode 11.3 运行时得到的唯一信息是:GPU 帧捕获:由于部署目标比设备版本旧,着色器性能数据可能不可用。 在我的应用程序将其打印为从后台线程调用的 UIView setAnimationsEnabled。不支持从 UIView 或子类上的后台线程执行任何操作,并且在我的应用程序 UI 冻结之后可能会导致意外和阴险的行为。主线程检查器不会去问题发生的地方。请问有什么建议吗??
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这与已接受的答案中已经提出的解决方案相同。如果您想改进已接受的答案以提及 Xcode 12,您可以通过编辑它来做到这一点。
    • 它在 XCODE 12 开头的字面意思是
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2011-04-02
    • 2018-03-03
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多