检测主线程之外的 UI 操作

2024-03-19

注:此问题涉及从后台线程调用 UIKit 时发出警告 https://stackoverflow.com/questions/10976424/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 可以在运行时发出这样的调用时发出警告?或者至少给我们一些工具来帮助调试此类问题。

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

您知道如何解决这个问题吗?


Xcode 9 及更高版本

Xcode 9 引入了主线程检查器 https://developer.apple.com/documentation/code_diagnostics/main_thread_checker它嗅探许多可能在主线程外执行的相关问题。您可以在方案选项中以通常的方式启用此分析器以及其他运行时分析器。

Xcode 8.3 及更早版本

替代方案,基于 Xcode 的解决方案steipete的要点 – 符号断点:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测主线程之外的 UI 操作 的相关文章

随机推荐