NSFetchedResultsController是否观察到对持久存储的所有更改?

时间:2011-09-02 08:17:45

标签: ios core-data nsfetchedresultscontroller nsmanagedobjectcontext nsnotifications

我的程序确实像下面的链接一样工作:

Update results of NSFetchedResultsController without a new fetch

  1. 将NSFetchedResultsController的结果显示为UITableView
  2. 从Web服务获取新对象并将其存储到核心数据(在相同的视图控制器中,使用RestKit)
  3. 使用NSFetchedResultsController委托的通知更新表视图
  4. 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,但它的工作原理相同。

2 个答案:

答案 0 :(得分:5)

  

我认为NSFetchedResultController会监视持久性中的所有更改   商店,是不是太大了?

FRC仅自动观察其获取返回的对象。这通常不是问题,因为FRC监视的对象的更改应该来自tableview UI或背景上下文。在前者中,FRC被警告该变化,并且在后者中,合并前景和背景上下文将触发FRC更新。

听起来你有代码更改值,但你没有通知FRC你做了任何改变。 (如果您有一个显示所有isMyTest == TRUE对象的tableview,那么显然您无法从isMyTest == FALSE的UI访问对象。)在这种情况下,您需要注册tableview控制器:

NSManagedObjectContextObjectsDidChangeNotification

...来自上下文的通知,以便您可以告诉FRC更新其观察之外所做的更改。

答案 1 :(得分:0)

我很抱歉我的错误,我测试了新的测试项目。

CoreData完全跟踪整个持久性存储。

这意味着,如果新对象适合谓词NSFetchedResultsController,委托将通知它。