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]
升级到lion后,以下错误会阻止核心数据模型的成功编译:
core-data-model/MyModel.xcdatamodeld:0:错误:路径'resources/MyModel.momd/MyModel.mom'的数据模型编译失败
这是执行以下命令的结果:
/ Developer/usr/bin/momc core-data-model/MyModel.xcdatamodeld resources/MyModel.momd
请注意,此命令在独立于xcode的自定义构建脚本中执行,并且在升级到Lion之前它运行没有问题.
升级到Lion之后我已经读过模型编译错误(例如看到这个问题),但那里详述的解决方案似乎并不适用.
升级到Lion后,是否有其他人遇到手动调用模型编译的问题?有任何想法吗?谢谢.