Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有mergeChangesFromContextDidSaveNotification的NSFetchedResultsController未按预期工作_Ios_Objective C_Multithreading_Core Data - Fatal编程技术网

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。”