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

8

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

你省略了这个堆栈跟踪的顶部,它会告诉我们这是在哪个线程上运行的。我敢打赌这不是主线程。例如,如果您从后台线程(例如URLSession完成闭包)启动segue,则viewDidLoad也不会在主线程上。您需要跟踪回去查看转换是在哪里启动的,并确认它在主线程上。或者,如果您确实在主线程上运行时得到了这个问题,我们需要看到最少量的代码,以便我们能够重现日志消息 - Rob
2个回答

5
如果这些报告消息让您感到困惑,请取消勾选它们:
  1. 编辑方案...enter image description here
  2. 在运行 > 诊断中,取消选中 "主线程检查器"enter image description here

3
记录日志比禁用日志要好,这样你会意识到并解决问题。 - Mubin Mall
2
在Xcode 9.3中,我需要在“测试”阶段而不是上面显示的“运行”阶段执行此操作。 - Intel

0

还要检查ARKit模板Xcode项目主线程检查器日志控制台

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接