首页 文章

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

提问于
浏览
7

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

Update results of NSFetchedResultsController without a new fetch

  • 将NSFetchedResultsController的结果显示为UITableView

  • 从Web服务获取新对象并将其存储到核心数据(在相同的视图控制器中,使用RestKit)

  • 更新表视图,包含NSFetchedResultsController委托的通知

从Apple的Core Data项目复制NSFetchedResultsControllerDelegate的实现,我的谓词是:

[NSPredicate predicateWithFormat:@"isMyTest == TRUE"]

如果属性更新从TRUE变为FALSE,则会从tableview中删除行(因为该行的对象位于NSFetchedResultsController的 fetchedObjects 中)

但是,如果属性更新从FALSE变为TRUE,则NSFetchedResultsController不会通知任何内容,因此无法在表视图中看到新数据 . 如果我手动更新 BOTH NSFetchedResulsController和UITableView,它会显示新数据 .

我以为NSFetchedResultController监视持久存储中的所有变化,是不是太大了希望? :d

(我真的想这样做,因为其他视图控制器可以更新持久存储,然后很难更新视图控制器 . )

如果是这样,你能让我知道如何以优美的方式更新NSFetchedResultsController?

(更新)

在NSfetchedResultsController的引用中,我读了下面的单词:

因此,控制器有效地具有三种操作模式,由它是否具有委托以及是否设置了缓存文件名来确定 . 无跟踪:委托设置为nil . 控制器只是提供对执行提取时的数据的访问 . 仅内存跟踪:委托是非零的,文件缓存名称设置为nil . 控制器监视其结果集中的对象并更新部分和订购信息以响应相关变化 . 完全持久跟踪:委托和文件缓存名称是非零的 . 控制器监视其结果集中的对象并更新部分和订购信息以响应相关变化 . 控制器维护其计算结果的持久高速缓存 .

“完全持久跟踪”并不意味着我想要什么?我设置了cacheName,但它的工作原理相同 .

2 回答

  • 5

    我以为NSFetchedResultController监视持久存储中的所有更改,是不是太大了希望?

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

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

    NSManagedObjectContextObjectsDidChangeNotification
    

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

  • 0

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

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

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

相关问题