我正在将CoreData设置更改为在NSManagedObjectContext
下有2 NSPersistentStoreCoordinator
个。
NSManagedObjectContext
已NSPrivateQueueConcurrencyType
实例化并设置为NSMergeByPropertyStoreTrumpMergePolicy
NSManagedObjectContext
实例化,NSMainQueueConcurrencyType
也设置为NSMergeByPropertyStoreTrumpMergePolicy
它们都没有通过“父 - 子”关系连接,但是它们被分配了相同的NSPersistentStoreCoordinator
对象。 主要上下文正在收听根上下文的NSManagedObjectContextDidSaveNotification
通知,并在performBlock:
内进行必要的合并
有时,当NSFetchedResultsController
的实例与主要上下文挂钩时,我会performFetch
由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'语句仍然有效'
我想知道我在这里做什么不应该做或者是核心数据的限制。
由于
答案 0 :(得分:4)
Florian Kugler写了一篇关于此的好文章:The Concurrent Core Data Stack
我们的想法是在私人队列环境中导入您的数据(导入上下文),这是主要上下文的孩子。
这个主要上下文在主队列上(我喜欢称之为UI队列),所以你可以在主线程(UI线程)中使用它的对象,而不必将它们从主线程的私有线程。
最后,主要上下文是根上下文的子项,它在自己的专用队列中运行。这样,保存将在后台线程中完成,而不会阻止您的UI。
由于在此设置中您从未触摸[根上下文],即您从未直接对其进行更改,因此所有更改都会在主要上下文中流动。因此,您将始终在主线程上获得最新数据。无需手动收听更改通知和合并更改。
我首先不担心性能。核心数据经过大量优化,如果出现性能问题,您可以减少单个导入工作人员保存的数据量。