【发布时间】:2013-04-09 19:52:10
【问题描述】:
注意:此问题与Warn on calls to UIKit from background threads 有关,但未对以下两种方法给出答案。
我遇到了应用程序屏幕快速闪烁的问题。我过去已经遇到过这个问题,这是由于在主线程之外更新了 UI 元素。
因此我在很多地方都放了以下代码:
assertMainThread();
这是:
#define assertMainThread() NSAssert([NSThread isMainThread],@"Method called using a thread other than main!")
当然,我不能用 assertMainThread() 覆盖整个代码,因为有很多地方,而且有些代码被后台 GCD 队列以合法的方式使用。
我查看了很多地方,但找不到让 XCode 或 LLDB 告诉我 UI 元素何时在主线程之外更新的方法。我认为可以使用符号断点或其他一些机制来中断例如在主线程之外调用 UIKit 中的常用方法但找不到方法的地方。
我还认为 UIKit 可以在进行此类调用时在运行时发出警告?或者至少给我们一些工具来帮助调试此类问题。
我查看(但未尝试)的另一种方法是使用一些代码覆盖技术并尝试从视觉上提取在代码中的哪个点运行的线程,但没有走那条路线。
您对如何解决这个问题有任何想法吗?
【问题讨论】:
-
我发现这很有趣并对其进行了调查:stackoverflow.com/questions/10424979/…
-
此代码(只需添加到项目并在没有 ARC 的情况下编译此文件)会导致 UIKit 访问主线程之外的断言:gist.github.com/steipete/5664345 我刚刚使用它来处理许多 UIKit/主线程问题我刚刚继承的一些代码。