我有一个代码块,它通过许多托管对象并从其关系中访问其他托管对象。如果98%的时间有效,但有时它会崩溃并显示以下日志:
线程6崩溃:
0 libobjc.A.dylib 0x000000018d51af70 objc_msgSend + 16
1 CoreData 0x0000000190dddef0 - [NSManagedObjectContext(_NSInternalAdditions)_retainedObjectWithID:optionalHandler:withInlineStorage:] + 84
2 CoreData 0x0000000190e2fc40 - [_ NSFaultingMutableSet willReadWithContents:] + 580
3 CoreData 0x0000000190dfe1ac - [_ NSFaultingMutableSet countByEnumeratingWithState:objects:count:] + 44
我知道相关的对象可能是错误。根据文档CoreData处理如下:
故障处理是透明的 - 您不必执行提取来实现故障。如果在某个阶段访问了一个故障对象的持久属性,那么Core Data会自动检索该对象的数据并初始化该对象。
如何解释(假设没有删除)?想更好地理解它。
答案 0 :(得分:1)
我知道这真的很晚,但是我只是遇到了同样的错误,希望这对其他人(以及将来对我自己)有帮助。此错误很可能是由于在与启动线程不同的线程上访问Core Data引起的。在我的情况下,Core Data是在不再位于主线程上的完成处理程序中访问的。
为帮助调试此问题,您可以使用并发调试断言来运行代码。您可以通过在Xcode的“方案编辑器”的“启动时传递的参数”部分中添加-com.apple.CoreData.ConcurrencyDebug 1
来启用它。 This article has instructions with that。每当从其他线程访问核心数据时,这都会导致我的应用始终崩溃,从而很容易修复。