当我以编程方式更改某些现有的托管对象属性时,我的表视图无法更新。我希望在这种情况下调用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
何时真正调用其委托?
感谢。
答案 0 :(得分:0)
如果无论更改类型如何都不会调用FRC委托方法,那么最可能的解释是委托未正确配置。它可能是由以下原因造成的:
NSFetchedResultsControllerDelegate
协议。我建议捕获保存操作的错误返回,以确保保存没有发生任何事情。
无论是否已保存,FRC都应通知其上下文的任何变更。然后FRC应通知其代表。
答案 1 :(得分:0)
我刚刚使用initWithFetchRequest发生了这个问题:managedObjectContext:sectionNameKeyPath:cacheName:其中sectionNameKeyPath是非零的。如果我确保sectionNameKeyPath为nil,那么我会得到我期望的更新。
我仍在调查为什么会发生这种情况