Core data 带有谓词的NSFetchedResultsController忽略从不同NSManagedObjectContext合并的更改

Core data 带有谓词的NSFetchedResultsController忽略从不同NSManagedObjectContext合并的更改,core-data,ios,nsfetchedresultscontroller,nspredicate,Core Data,Ios,Nsfetchedresultscontroller,Nspredicate,我使用具有谓词的NSFetchedResultsController呈现表视图内容: [NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]] 在后台线程上,使用单独的NSManagedObjectContextI更新少数实体,并将它们的visible值从NO更改为YES。在主线程的NSManagedObjectContext中保存、合并更改。但是NSFetchedResultsContr

我使用具有谓词的
NSFetchedResultsController
呈现表视图内容:

[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]
在后台线程上,使用单独的
NSManagedObjectContext
I更新少数实体,并将它们的
visible
值从
NO
更改为
YES
。在主线程的
NSManagedObjectContext
中保存、合并更改。但是
NSFetchedResultsController
fetchedObject
没有改变。另外,控制器不在委托上调用
-controller:didChangeObject:…
。如果在主线程上以相同的方式更新实体(我的测试应用程序调用相同的方法),那么一切都会按预期进行

通知的
NSUpdatedObjectsKey
也包含这些对象

目前,我找到的唯一解决方案是调用每个
NSUpdatedObjectsKey
实体:

NSManagedObjectContext *context = ... // main thread context
[context existingObjectWithID:[object objectID] error:nil]
此问题仅适用于以前与谓词不匹配的更新的对象


我是否遗漏了一些明显的内容?

结果显示,主
NSManagedObjectContext
没有对更新对象触发事件
NSManagedObjectContextObjectsDidChangeNotification
,因为它没有对故障对象执行

通用修复(或跟踪需要此处理的对象ID):

发件人:

您可以使用 键值nil,以确保 故障已触发,如图所示 通过下面的例子

合并来自其他NSManagedObjectContext的更改后,必须在后台NSManagedObjectContext上调用processPendingChanges

请参阅CoreData编程指南:

请注意,更改通知是在NSManagedObjectContext的 processPendingChanges方法。主线程被绑定到事件中 循环应用程序,以便调用processPendingChanges 在主服务器拥有的上下文上的每个用户事件之后自动执行 线当方法为 调用取决于平台和发布版本,因此 不应依赖于特定的时间。如果次上下文不是 在主线程上,您应该自己调用processPendingChanges 适当的结合点


这节省了我很多时间。我对此投了足够的票。谢谢。哇,我也是。我在这上面浪费了好几个小时!听起来像是在后台线程上进行合并。需要在主/UI线程上合并更改,才能正确触发事件。如果您使用的是父/子MOC,因为它们在内部处理这些通知,那么这是没有意义的。不,我所有的更改和合并都发生在主线程上。明天我将创建一个带有雷达的示例项目。使用MagicalRecord,我似乎遇到了同样的问题。然而,上面的修复对我来说不起作用。我的FRC在后台上下文(线程)上,我没有看到更改。你确定这会解决上述问题吗?我不认为NSFetchedResults控制器正在侦听来自后台上下文的更改通知。
mergeChangesFromContextDidSaveNotification:
执行(几乎)与
processPendingChanges
相同的过程,并发布相应的通知。并不是说
mergechanges fromContextDidSaveNotification
执行的过程与
processPendingChanges
相同,而是
processPendingChanges
作为合并的一部分被调用
processPendingChanges
保证在每次运行循环结束时(至少在macOS上)或每次保存上下文时调用。它也被称为合并的一部分。这不是核心数据的错误吗?我认为我们应该向苹果公司报告错误。我刚做了一个,虫子?如果有任何进展?此错误最终在iOS 10中修复:
NSManagedObjectContext *context = [self managedObjectContext];
for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) {
  [[context objectWithID:[object objectID]] willAccessValueForKey:nil];
}

[context mergeChangesFromContextDidSaveNotification:notification];