iOS 的 UIKit 不是线程安全的,让我们称之为众所周知的事实。我知道规则,我很小心,但我仍然会被咬 - 而且时不时地导致的崩溃与对 UIKit 的令人讨厌的后台调用相距甚远,从而使追踪问题成为一种不那么愉快的体验。
这个问题似乎很容易解决——让 UIKit 类/方法在从后台线程调用时发出警告,至少作为调试功能。据我所知,iOS 不提供任何此类功能。当然,可以通过在此类调用之前添加某种形式的断言来手动实现相同的效果,但这种解决方案并不是最优雅的,而且还存在与原始问题相同的弱点,即程序员容易健忘。
有没有人有更优雅的解决方案?你如何在你的项目中处理这个问题?
(注意:这个问题是相关的,但不是很明确。有人想知道)
更新:安德鲁的答案是我当时正在寻找的解决方案,但请注意,至少从 Xcode 9 开始,这现在由 xcode/ios 提供。例如,添加以下代码:
DispatchQueue.global().async {
print(self.view.frame)
}
UIView 的 viewDidLoad 方法在 Xcode 中内联产生运行时警告UIView.frame 必须仅从主线程使用,并且将一条消息打印到控制台:主线程检查器:在后台线程上调用 UI API:-[UIView 框架]