检测主线程之外的UI操作

Res*_*h32 20 uikit ios xcode4 lldb

注意:这个问题与从后台线程调用UIKit的警告有关,但没有给出下面两种方法的答案.

我有一个问题,应用程序屏幕快速闪烁.我过去已经遇到过这个问题,这是因为更新了主线程之外的UI元素.

因此,我将以下代码放在很多地方:

assertMainThread();
Run Code Online (Sandbox Code Playgroud)

这是:

#define assertMainThread() NSAssert([NSThread isMainThread],@"Method called using a thread other than main!")
Run Code Online (Sandbox Code Playgroud)

当然我无法使用assertMainThread()来覆盖整个代码,因为有很多地方和一些代码由背景GCD队列以合法的方式使用.

我看了很多地方,但找不到XCode或LLDB告诉我何时在主线程之外更新UI元素的方法.我认为可以使用符号断点或其他一些机制来破解UIKit中常见方法在主线程外部调用的地方,但是找不到方法.

我还以为UIKit可以在运行时发出警告吗?或者至少给我们一些工具来帮助调试这些问题.

我看过的另一种方法(但没有尝试)是使用一些代码覆盖技术,并尝试在视觉中提取代码中的哪个线程,但没有走那条路.

你对如何解决这个问题有任何想法吗?

Mic*_*chi 41

Xcode 9及更高版本

Xcode 9引入了一个主线程检查器,它可以嗅探可能在主线外执行的许多相关问题.您可以在Scheme选项中以常规方式启用此分析器以及其他运行时分析器.

Xcode 8.3及更早版本

另一种基于steipete的要点的Xcode方式解决方案- 符号断点:

Xcode符号断点

您可以轻松地为任何UIKit类的其他方法添加断点,例如-[UIView setNeedsDisplay]等.

  • 这非常有用!TX! (2认同)