我按以下方式设置核心数据应用:
NSManagedObjectContext
NSPrivateQueueConcurrencyType
NSManagedObjectContext
NSMainQueueConcurrencyType
这两个上下文共享一个持久的商店协调员。
我有viewController
collectionView
使用NSFetchedResultsController
和主队列上下文来保持用户界面最新。
我的fetchedResults控制器谓词如下所示:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"inRegion == YES"];
我使用我的私有队列上下文导入网络数据,然后使用mergeChangesFromContextDidSaveNotification
将更改合并到主上下文中。
此技术大部分时间都有效,除非对象inRegion从NO变为YES。我执行保存,然后从privateQueueContextDidSave
通知合并到主队列上下文。此更改显示在此通知中。当我查看mainQueueContextObjectsDidChange
通知时,此更改不存在,这解释了为什么获取的结果控制器不更新UI。
我的猜测是因为inRegion==NO
,主要上下文实际上不包含此对象,因为它不符合获取结果控制器的谓词。删除谓词后,更改会显示在mainQueueContextObjectsDidChange
通知中。在主队列上下文中执行所有操作也可以解决问题。
我的问题是,如何保持从主线程卸载工作的好处,保持我的谓词和核心数据堆栈相同,并确保mainQueueContextObjectsDidChange
通知NSFetchedResultsController
使用用于报告更改的委托方法)包含所有必需的更改信息。