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

amp*_*ell 27 core-data nspredicate nsfetchedresultscontroller ios

我正在使用NSFetchedResultsController具有谓词的表视图内容:

[NSPredicate predicateWithFormat:@"visible == %@", [NSNumber numberWithBool:YES]]
Run Code Online (Sandbox Code Playgroud)

在后台线程使用单独NSManagedObjectContext我更新几个实体并将其visible值更改NOYES.保存,合并主线程中的更改NSManagedObjectContext.但是,NSFetchedResultsControllerfetchedObjects没有改变.控制器也不会调用-controller:didChangeObject:...委托.如果实体在主线程上以相同的方式更新(我的测试应用程序调用相同的方法),一切都按预期工作.

通知也NSUpdatedObjectsKey包含这些对象.

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

NSManagedObjectContext *context = ... // main thread context
[context existingObjectWithID:[object objectID] error:nil]
Run Code Online (Sandbox Code Playgroud)

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

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

amp*_*ell 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];
Run Code Online (Sandbox Code Playgroud)

来自NSManagedObject类参考:

您可以使用键值nil调用此方法以确保已触发故障,如以下示例所示.

  • 使用MagicalRecord,我似乎遇到了同样的问题.但是上面的修复对我不起作用.我在背景上下文(线程)上有我的FRC,我没有看到更改. (2认同)