具有谓词的NSFetchedResultsController忽略从不同NSManagedObjectContext合并的更改

我使用NSFetchedResultsController呈现表视图内容,它有一个谓词:

 [NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]] 

在使用单独NSManagedObjectContext后台线程上,我更新了一些实体,并将其visible值从NO更改为YES 。 保存,合并主线程的NSManagedObjectContext更改。 但fetchedObjects不会改变。 另外控制器不会在-controller:didChangeObject:...上调用-controller:didChangeObject:... 如果实体在主线程上以相同的方式更新(我的testing应用程序调用相同的方法),一切都按预期工作。

另外通知的NSUpdatedObjectsKey包含这些对象。

目前唯一的解决scheme是find每个NSUpdatedObjectsKey实体:

 NSManagedObjectContext *context = ... // main thread context [context existingObjectWithID:[object objectID] error:nil] 

此问题仅适用于以前与谓词不匹配的更新对象。

我错过了什么明显的?

对于更新的对象,主NSManagedObjectContext没有事件触发NSManagedObjectContextObjectsDidChangeNotification ,因为它不是为故障对象完成的。

通用修复(或保留需要这种处理的对象ID的轨迹):

 NSManagedObjectContext *context = [self managedObjectContext]; for(NSManagedObject *object in [[notification userInfo] objectForKey:NSUpdatedObjectsKey]) { [[context objectWithID:[object objectID]] willAccessValueForKey:nil]; } [context mergeChangesFromContextDidSaveNotification:notification]; 

从NSManagedObject类参考 :

您可以使用键值nil来调用此方法,以确保发生故障,如以下示例所示。

您必须在您从其他NSManagedObjectContext合并更改之后调用Background-NSManagedObjectContext上的processPendingChanges

请参阅CoreData编程指南:

请注意,更改通知在NSManagedObjectContext的processPendingChanges方法中发送。 主线程绑定到应用程序的事件循环中,以便在主线程拥有的上下文中的每个用户事件之后自动调用processPendingChanges。 这不是后台线程的情况 – 当调用方法取决于平台和发行版本,所以你不应该依赖于特定的时间。 如果辅助上下文不在主线程中,则应该在适当的时刻调用processPendingChanges。