5

当我以编程方式更改某些现有的托管对象属性时,我的表视图没有更新,我有一个问题。我希望我的NSFetchedResultsControllerDelegate在这种情况下被调用,但事实并非如此。核心数据:更新托管对象不会调用NSFetchedResultsControllerDelegate

苹果医生说:

NSFetchedResultsController实例使用在这个协议的方法其委托控制器的撷取结果已被更改通知由于添加,删除,移动,或更新操作。

更详细地说,我的管理对象是一个int属性,名为status,它取值为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 get方法这与苹果公司的文档相矛盾。另外,没有平滑的动画发生。

我预计controllerWillChangeContent:,controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controllerDidChangeContent:被调用。

我想我错过了一些东西,可能是很明显的东西,但我看不到。每次有一些托管对象可能发生更改时,是否需要调用performFetch:NSFetchedResultsControllerD真的什么时候调用它的委托?

谢谢。

+0

您是否发现此行为的任何解决方案?我面临类似的情况,我的委托回调从未触发更新操作。无论如何,添加新对象或删除现有对象都会调用委托方法。可能是什么原因? – 2012-11-18 19:46:52

回答

0

如果FRC委托方法永远不会被调用,而不考虑更改的类型,那么最可能的解释是代理没有正确配置。它可以由以下原因引起:

  1. 的代表是简单的没有设置
  2. 委托类未声明的NSFetchedResultsControllerDelegate协议。
  3. 您在不合并的情况下在另一个上下文中进行更改。

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

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

+1

1.'aFetchedResultsController.delegate = self;'存在 2.双重检查。 3.我只有一个上下文,从应用程序委托传递。正如我写的,它基本上是香草苹果代码。任何其他想法还有什么要检查? 当然,我从保存中捕获错误。我只是简化了我的代码片段的这个问题。 – 2010-08-31 15:09:41

0

我刚刚发生过这种情况,只是发生在initWithFetchRequest中:managedObjectContext:sectionNameKeyPath:cacheName:其中sectionNameKeyPath非零。如果我确保sectionNameKeyPath是零,那么我会得到像我期望的更新。

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

相关问题