Ios 具有mergeChangesFromContextDidSaveNotification的NSFetchedResultsController未按预期工作
我有一个核心数据应用程序,设置方式如下:Ios 具有mergeChangesFromContextDidSaveNotification的NSFetchedResultsController未按预期工作,ios,objective-c,multithreading,core-data,Ios,Objective C,Multithreading,Core Data,我有一个核心数据应用程序,设置方式如下: 使用NSPrivateQueueConcurrencyType 使用NSMainQueueConcurrencyType 这两个上下文共享一个持久存储协调器 我有一个viewController和一个collectionView,它使用带有主队列上下文的NSFetchedResultsController来保持UI最新 我的fetchedResults控制器谓词如下所示: fetchRequest.predicate = [NSPredicate p
- 使用
NSPrivateQueueConcurrencyType
- 使用
NSMainQueueConcurrencyType
viewController
和一个collectionView
,它使用带有主队列上下文的NSFetchedResultsController
来保持UI最新
我的fetchedResults控制器谓词如下所示:
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"inRegion == YES"];
我使用我的专用队列上下文导入网络数据,然后使用mergeChangesFromContextDidSaveNotification
将更改合并到主上下文中
除了区域中的对象从“否”变为“是”时,此技术在大多数情况下都有效。我执行一个保存,然后从privateQueueContextDidSave
通知合并到主队列上下文。更改将显示在此通知中。当我查看mainQueueContextObjectsIDChange
通知时,此更改不存在,这解释了获取结果控制器不更新UI的原因
我的猜测是,因为inRegion==NO
,主上下文实际上不包含此对象,因为它不满足获取结果控制器的谓词。删除谓词时,更改将显示在mainQueueContextObjectsIDChange
通知中。在主队列上下文中执行所有操作也可以解决问题
我的问题是,我如何保持从主线程卸载工作的好处,保持谓词和核心数据堆栈相同,并确保mainQueueContextObjectsIDChange
通知(NSFetchedResultsController用于报告更改的委托方法)包含所有必需的更改信息 在中,Apple建议:“如果次要上下文不在主线程上,您应该在适当的连接点自己调用processPendingChanges。”