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