一个NSPersistentStoreCoordinator下的多个NSManagedObjectContexts抛出'语句仍处于活动状态'异常

时间:2015-09-16 07:46:16

标签: ios core-data nsmanagedobjectcontext

我正在将CoreData设置更改为在NSManagedObjectContext下有2 NSPersistentStoreCoordinator个。

  1. 根上下文 NSManagedObjectContextNSPrivateQueueConcurrencyType实例化并设置为NSMergeByPropertyStoreTrumpMergePolicy
  2. 主要上下文 NSManagedObjectContext实例化,NSMainQueueConcurrencyType也设置为NSMergeByPropertyStoreTrumpMergePolicy
  3. 它们都没有通过“父 - 子”关系连接,但是它们被分配了相同的NSPersistentStoreCoordinator对象。 主要上下文正在收听根上下文NSManagedObjectContextDidSaveNotification通知,并在performBlock:内进行必要的合并

    有时,当NSFetchedResultsController的实例与主要上下文挂钩时,我会performFetch

    由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'语句仍然有效'

    我想知道我在这里做什么不应该做或者是核心数据的限制。

    由于

1 个答案:

答案 0 :(得分:4)

Florian Kugler写了一篇关于此的好文章:The Concurrent Core Data Stack

我们的想法是在私人队列环境中导入您的数据(导入上下文),这是主要上下文的孩子。

这个主要上下文在主队列上(我喜欢称之为UI队列),所以你可以在主线程(UI线程)中使用它的对象,而不必将它们从主线程的私有线程。

最后,主要上下文是根上下文的子项,它在自己的专用队列中运行。这样,保存将在后台线程中完成,而不会阻止您的UI。

  

由于在此设置中您从未触摸[根上下文],即您从未直接对其进行更改,因此所有更改都会在主要上下文中流动。因此,您将始终在主线程上获得最新数据。无需手动收听更改通知和合并更改。

我首先不担心性能。核心数据经过大量优化,如果出现性能问题,您可以减少单个导入工作人员保存的数据量。