【问题标题】:Main Thread Checker: UI API called on a background thread: -[UIApplication delegate]主线程检查器:在后台线程上调用的 UI API:-[UIApplication 委托]
【发布时间】:2017-06-13 05:26:17
【问题描述】:

Xcode 9 似乎报告了很多对 UIApplication 属性的主线程调用。即使 UI 没有更新,这也特别麻烦,因为它会生成默认环境的日志扩展。

4   TestApp                             0x0000000101c262e0 __39-[ViewController viewDidLoad]_block_invoke + 196
5   libdispatch.dylib                   0x0000000102279654 _dispatch_call_block_and_release + 24
6   libdispatch.dylib                   0x0000000102279614 _dispatch_client_callout + 16
7   libdispatch.dylib                   0x0000000102289008 _dispatch_queue_serial_drain + 716
8   libdispatch.dylib                   0x000000010227ce58 _dispatch_queue_invoke + 340
9   libdispatch.dylib                   0x000000010228a1c4 _dispatch_root_queue_drain_deferred_wlh + 412
10  libdispatch.dylib                   0x00000001022917fc _dispatch_workloop_worker_thread + 868
11  libsystem_pthread.dylib             0x00000001ac6771e8 _pthread_wqthread + 924
12  libsystem_pthread.dylib             0x00000001ac676e40 start_wqthread + 4

【问题讨论】:

  • 你已经省略了这个堆栈跟踪的顶部,它可以告诉我们这是在哪个线程上运行的。我敢打赌这不是主线。例如,如果您从后台线程启动 segue(例如,URLSession 完成闭包),viewDidLoad 也不会在主线程上。您需要回溯以查看转换是从哪里开始的,并确认它在主线程上。或者,如果你真的在主线程上运行时得到了这个,我们需要查看允许我们reproduce the log messages 的最少代码量。

标签: ios multithreading ios11 xcode9


【解决方案1】:

如果这些报告消息让您感到困惑取消选中它们

  1. 编辑方案...
  2. 在“运行”>“诊断”中取消选中“主线程检查器”

【讨论】:

  • 拥有该日志而不是禁用该日志是件好事...!这样你就会意识到并解决这个问题。
  • 在 Xcode 9.3 中,我需要为“测试”阶段而不是如上所示的“运行”阶段执行此操作。
【解决方案2】:

还要检查ARKit template Xcode project Main Thread Checker log console

如果从另一个线程调用 UIApplication 或 UIApplicationDelegate 方法,您可以像 CGN 回答中那样禁用检查线程,但它会完全禁用此检查器。您还可以将必要的子类化并在主线程上调用超类的方法。这样你仍然可以在代码的其他地方使用 Main Thread Sanitizer

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2019-08-17
    • 2011-04-09
    相关资源
    最近更新 更多