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

时间:2010-08-31 08:48:06

标签: cocoa-touch uitableview core-data nsfetchedresultscontroller

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

Apple doc说:

  

NSFetchedResultsController的实例使用此协议中的方法通知其代理控制器的获取结果因添加,删除,移动或更新操作而发生更改。

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

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate];

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

以下是我的尝试:

myObject.status = [NSNumber numberWithInt:upToDate];
[managedObjectContext save:nil];
[managedObjectContext processPendingChanges];
[myTableView reloadData];

最后,我设法通过调用:

来更新我的表视图
[fetchedResultsController performFetch:&error];
[myTableView reloadData];

但即便如此,我的NSFetchedResultsControllerDelegate方法也没有被调用,与Apple的文档相矛盾。此外,没有平滑的动画发生。

我希望调用controllerWillChangeContent:controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controllerDidChangeContent:

我想我错过了一些东西,可能是显而易见的东西,但我看不清楚。每次某个托管对象可能发生更改时,是否需要调用performFetch:NSFetchedResultsControllerD 何时真正调用其委托?

感谢。

2 个答案:

答案 0 :(得分:0)

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

  1. 委托很简单,没有设置
  2. 委托类未声明NSFetchedResultsControllerDelegate协议。
  3. 您可以在不合并的情况下在其他上下文中进行更改。
  4. 我建议捕获保存操作的错误返回,以确保保存没有发生任何事情。

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

答案 1 :(得分:0)

我刚刚使用initWithFetchRequest发生了这个问题:managedObjectContext:sectionNameKeyPath:cacheName:其中sectionNameKeyPath是非零的。如果我确保sectionNameKeyPath为nil,那么我会得到我期望的更新。

我仍在调查为什么会发生这种情况