主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed

Posted

技术标签:

【中文标题】主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed【英文标题】:Main Thread Checker: UI API called on a background thread iOS 11 Xcode 9 GM Seed 【发布时间】:2017-09-18 12:10:46 【问题描述】:

从我开始使用 Xcode 9 GM 种子和 ios 11 GM 种子开始,任何人都可以帮助我调试这个问题,我的代码在控制台中向我抛出警告说:

2017-09-18 16:22:52.872716+0530 **** *****[359:20158] [reports] Main Thread Checker: UI API called on a background thread: -[UIApplication 
  applicationState] .PID: 359, TID: 20158, 
  Thread name: Runtime Network Callback Thread, 
  Queue name: com.apple.root.default-qos.overcommit, QoS: 21
  Backtrace:

另外,我在我的应用程序中使用 ESRI 地图,当我放大或缩小 ESRI 地图时,我会收到此错误:

  2017-09-18 16:22:53.176524+0530 *** ***[359:20063] Task <5F9376DB-9335-
  4A45-B3F0-1D6FD69A19A3>.<29> finished with error - code: -999
  2017-09-18 16:22:53.178923+0530 *** ***[359:20142] Task <0DE282EA-3FBD-
  4036-8298-C75EFA65F15A>.<40> HTTP load failed (error code: -999 [1:89])
  2017-09-18 16:22:53.179821+0530 *** *[359:20063] Task <BE2D8BAE-FFB8-
  43CA-8723-111326DEF4FD>.<31> finished with error - code: -999
  2017-09-18 16:22:53.180089+0530 *** ***[359:20063] Task <E7C819D4-C11A-
  4915-B021-A73F31BE89CD>.<33> finished with error - code: -999
  2017-09-18 16:22:53.180365+0530 *** ***[359:20063] Task <3B871761-B006-
  4220-B857-6204B385AD34>.<34> finished with error - code: -999
  2017-09-18 16:22:53.180523+0530 *** ***[359:20142] Failed to get 
  TCPIOConnection in addInputHandler.

应用程序在 Xcode 8 iOS 10.3.3 上运行良好。问题似乎出在 Xcode 9 上。任何人都可以帮我调试这个问题。谢谢

【问题讨论】:

有同样的“完成错误 - 代码:-999”的东西。知道如何解决它会很有趣。 【参考方案1】:

Xcode 9 添加了一个新的运行时检查,即Main Thread Checker。

根据 Apple 文档:

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

您已经在使用 Xcode 8 的应用中遇到了这个问题。只是检测它的工具还没有。

在您的情况下,似乎是对 UIApplication.shared.applicationState 的调用导致了此运行时问题。

您可以将应用方案配置为在发生时停止执行。它是 Diagnostics 选项卡中的一个复选框,位于 Main Thread Checker 部分下。

【讨论】:

以上是关于主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed的主要内容,如果未能解决你的问题,请参考以下文章

主线程检查器:在后台线程上调用的 UI API:-[UIApplication applicationState]

CoreMotion 显然是从后台线程调用 UI API

最佳后台处理/API 调用方法?

在 .Net Core 的另一个线程上调用函数

无法从 iOS6 中的后台线程调用主线程上的代码

试图了解 iOS 中后台线程行为的幕后情况