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

时间:2010-10-13 12:53:46

标签: core-data ios nsfetchedresultscontroller nspredicate

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

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

在后台线程中使用单独的NSManagedObjectContext我更新了几个实体,并将visible值从NO更改为YES。保存,合并主线程NSManagedObjectContext中的更改。但是NSFetchedResultsController的{​​{1}}并没有改变。控制器也不会在委托上调用fetchedObjects。如果实体在主线程上以相同的方式更新(我的测试应用程序调用相同的方法),一切都按预期工作。

通知的-controller:didChangeObject:...也包含这些对象。

目前,我发现的唯一解决方案是呼叫每个NSUpdatedObjectsKey个实体:

NSUpdatedObjectsKey

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

我错过了一些明显的东西吗?

2 个答案:

答案 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   适当的接合点。