我的程序确实像下面的链接一样工作:
Update results of NSFetchedResultsController without a new fetch
NSFetchedResultsControllerDelegate的实现是从Apple的Core Data项目中复制的,我的谓词是:
[NSPredicate predicateWithFormat:@"isMyTest == TRUE"]
如果属性更新从TRUE变为FALSE,则会从tableview中删除行(因为该行的对象位于NSFetchedResultsController的fetchedObjects
中)
但是,如果属性更新从FALSE变为TRUE,则NSFetchedResultsController不会通知任何内容,因此无法在表视图中看到新数据。如果我手动更新 BOTH NSFetchedResulsController和UITableView,它会显示新数据。
我认为NSFetchedResultController监视持久存储中的所有更改,是不是太大了希望? :D(我真的很想这样做,因为其他视图控制器可以更新持久存储,然后很难更新视图控制器。)
如果是这样,你能告诉我如何以优美的方式更新NSFetchedResultsController吗?
(更新)
在NSfetchedResultsController的引用中,我读了下面的单词:
因此,控制器有效地具有三种操作模式 是否有委托以及是否设置了缓存文件名。
无跟踪:委托设置为nil。控制器简单 提供对执行提取时的数据访问。
仅内存跟踪:委托是非零和文件缓存名称 设置为零。控制器监视其结果集中的对象 更新部分和订购信息以响应相关 变化。
完全持久跟踪:委托和文件缓存名称 非空。控制器监视其结果集和更新中的对象 部分和订购信息以响应相关变化。该 controller维护其结果的持久缓存 计算
“完全持续跟踪”并不意味着我想要什么?我设置了cacheName,但它的工作原理相同。
答案 0 :(得分:5)
我认为NSFetchedResultController会监视持久性中的所有更改 商店,是不是太大了?
FRC仅自动观察其获取返回的对象。这通常不是问题,因为FRC监视的对象的更改应该来自tableview UI或背景上下文。在前者中,FRC被警告该变化,并且在后者中,合并前景和背景上下文将触发FRC更新。
听起来你有代码更改值,但你没有通知FRC你做了任何改变。 (如果您有一个显示所有isMyTest == TRUE
对象的tableview,那么显然您无法从isMyTest == FALSE
的UI访问对象。)在这种情况下,您需要注册tableview控制器:
NSManagedObjectContextObjectsDidChangeNotification
...来自上下文的通知,以便您可以告诉FRC更新其观察之外所做的更改。
答案 1 :(得分:0)
我很抱歉我的错误,我测试了新的测试项目。
CoreData完全跟踪整个持久性存储。
这意味着,如果新对象适合谓词NSFetchedResultsController,委托将通知它。