具有谓词的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。