带有mergeChangesFromContextDidSaveNotification的NSFetchedResultsController无法按预期工作

时间:2014-10-29 01:45:57

标签: ios objective-c multithreading core-data

我按以下方式设置核心数据应用

  • 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使用用于报告更改的委托方法)包含所有必需的更改信息。

0 个答案:

没有答案