核心数据崩溃NSInternalInconsistencyException'语句仍处于活动状态'

时间:2015-02-19 16:46:37

标签: ios objective-c core-data nsmanagedobjectcontext

我有两个托管对象上下文,它们共享同一个持久性存储协调器:

  • 主线程{/ 1}}和
  • 之一
  • 用于进行后台处理的NSMainQueueConcurrencyType

所有数据解析工作都在针对私有队列的performBlock调用中进行,并通过NSPrivateQueueConcurrencyType合并到主线程上的UI更新。

我启用了Core Data多线程断言,并且在崩溃发生时它们永远不会触发。

当我在背景上下文工作时推入一个NSManagedObjectContextDidSaveNotification的新视图时,我偶尔会遇到statement is still active的崩溃。崩溃将触发对获取的结果控制器的获取或在存储数据的代码中。当它在数据解析部分崩溃时,它总是以多对多关系失败。

到目前为止,这些崩溃是100%的iOS 8,我从未在7上看过它们。

我的问题是这样的:假设我没有违反线程限制(断言应该大声喊叫,而且还没有......)还有其他明显可以做的事吗这会导致主线程上下文在后台线程处于持久存储的工作过程中轰炸出来吗?

以下是Crashlytics所说的内容:

NSFetchedResultsController

2 个答案:

答案 0 :(得分:1)

我最终改变了我创建核心数据堆栈的方式,但这一切都消失了。移动到持久性存储上下文,子UI上下文和孙子背景上下文并且适当地持久化链条使得这一切变得更好。我仍然不能100%确定为什么原始设置不适用于8。

答案 1 :(得分:0)

您可以使用nsmanaged对象上下文的副本作为nsmanagedobject上下文的新实例。 对于每个托管对象上下文,您应该使用这样的方法来保存多线程中的不一致性

[backgroundMOC performBlockAndWait:^{
    // read/write operation
    [backgroundMOC saveContextWithMOC:backgroundMOC];
}];

//主线程MOC

[mainMOC performBlockAndWait:^{
    // read/write operation
    [backgroundMOC saveContextWithMOC:backgroundMOC];
}];