iOS的UIKit不是线程安全的,让我们称之为众所周知的事实.我知道这个规则,我很小心,但我仍然被咬了 – 而且偶尔会因为违规背景调用UIKit而导致崩溃,这使得追踪问题的能力低于欢乐体验.
这个问题似乎很容易解决 – 让UIKit类/方法在从后台线程调用时发出警告,至少作为调试功能.据我所知,iOS不提供任何此类功能.当然,通过在这样的调用之前使用某种形式的断言可以手动实现相同的效果,但是这种解决方案不是最优雅的,并且另外存在与原始问题相同的弱点,即程序员易于忘记.
有没有人有更优雅的解决方案?你如何处理项目中的这个问题?
(注意:this question是相关的,但不是那么明确.一个人想知道)
更新:安德鲁的答案是我当时正在寻找的解决方案,但请注意,至少从Xcode 9开始,这是由xcode / ios提供的.例如,添加以下代码:
DispatchQueue.global().async { print(self.view.frame) }
UIView的viewDidLoad方法在Xcode中生成运行时警告UIView.frame必须仅在主线程中使用,并且消息打印到控制台:主线程检查器:在后台线程上调用UI API: – [UIView frame]
解决方法
此代码(仅添加到项目并在没有ARC的情况下编译此文件)会导致主线程外部的UIKit访问断言:
https://gist.github.com/steipete/5664345
我刚用它来拾取我刚收到的一些代码中的大量UIKit /主线程问题.