我使用带有谓词的NSFetchedResultsController
来呈现表格视图内容:
[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]
在后台线程中使用单独的NSManagedObjectContext
我更新了几个实体,并将visible
值从NO
更改为YES
。保存,合并主线程NSManagedObjectContext
中的更改。但是NSFetchedResultsController
的{{1}}并没有改变。控制器也不会在委托上调用fetchedObjects
。如果实体在主线程上以相同的方式更新(我的测试应用程序调用相同的方法),一切都按预期工作。
通知的-controller:didChangeObject:...
也包含这些对象。
目前,我发现的唯一解决方案是呼叫每个NSUpdatedObjectsKey
个实体:
NSUpdatedObjectsKey
此问题仅适用于之前与谓词不匹配的已更新对象。
我错过了一些明显的东西吗?
答案 0 :(得分:53)
对于更新的对象,主要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 Class Reference:
您可以使用。调用此方法 nil的关键值确保a 如图所示,故障被解雇了 通过以下示例。
答案 1 :(得分:2)
在合并其他NSManagedObjectContext的更改后,必须在Background-NSManagedObjectContext上调用 processPendingChanges 。
参见CoreData编程指南:
请注意,更改通知是在NSManagedObjectContext中发送的 processPendingChanges方法。主线程与事件联系在一起 为应用程序循环,以便调用processPendingChanges 在主要拥有的上下文上的每个用户事件之后自动执行 线。背景线程不是这种情况 - 当方法是 调用取决于平台和发布版本,所以你 不应该依赖于特定的时机。如果次要上下文不是 在主线程上,你应该自己调用processPendingChanges 适当的接合点。