核心数据:更新托管对象不会调用NSFetchedResultsControllerDelegate

Jea*_*uys 5 cocoa-touch core-data uitableview nsfetchedresultscontroller

当我以编程方式更改某些现有的托管对象属性时,我的表视图无法更新.我希望NSFetchedResultsControllerDelegate在这种情况下我会被召唤,但事实并非如此.

Apple doc说:

NSFetchedResultsController此协议中使用方法的一个实例,用于通知其委托控制器的提取结果由于添加,删除,移动或更新操作而已更改.

更详细地说,我的托管对象作为一个名为int的属性status从一个中获取值enum.我的表视图只显示那些status等于upToDate(枚举值之一)的对象.为此,我的FetchedResultController有一个谓词来测试该状态:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate];
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我将过时的对象更改回状态时,不会反映更新upToDate.我的代码是从Apple的模板修改的.

这是我尝试过的:

myObject.status = [NSNumber numberWithInt:upToDate];
[managedObjectContext save:nil];
[managedObjectContext processPendingChanges];
[myTableView reloadData];
Run Code Online (Sandbox Code Playgroud)

最后,我设法让我的表视图更新,并调用:

[fetchedResultsController performFetch:&error];
[myTableView reloadData];
Run Code Online (Sandbox Code Playgroud)

但即使在那时,我的NSFetchedResultsControllerDelegate方法都没有被调用,与Apple的文档相矛盾.此外,没有平滑的动画发生.

我期待controllerWillChangeContent:,controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:并且controllerDidChangeContent:被称为.

我想我错过了一些东西,可能是显而易见的东西,但我看不清楚.performFetch:每次某些托管对象可能发生变化时是否需要调用?什么时候NSFetchedResultsControllerD 真的称它为代表?

谢谢.

Tec*_*Zen 0

如果无论更改类型如何,FRC 委托方法都不会被调用,那么最可能的解释是委托配置不正确。其原因可能是:

  1. delegate简单没有设置
  2. 委托类不声明NSFetchedResultsControllerDelegate协议。
  3. 您可以在另一个上下文中进行更改而不进行合并。

我建议捕获保存操作的错误返回,以确保保存没有发生任何事情。

其上下文的任何更改都应通知 FRC,无论这些更改是否已保存。FRC 随后应通知其代表。