【问题标题】:Does NSFetchedResultsController Observe All Changes to Persistent Store?NSFetchedResultsController 是否观察到持久存储的所有更改?
【发布时间】:2011-11-08 23:57:26
【问题描述】:

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

Update results of NSFetchedResultsController without a new fetch

  1. 将 NSFetchedResultsController 的结果显示到 UITableView
  2. 从 Web 服务获取新对象并将其存储到核心数据(在同一个视图控制器中,使用 RestKit)
  3. 使用 NSFetchedResultsController 委托通知更新表视图

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

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

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

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

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

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

如果是这样,您能告诉我如何以精美的方式更新 NSFetchedResultsController 吗?

(更新)

参考 NSfetchedResultsController,我读到以下文字:

因此,控制器有效地具有三种操作模式,确定 通过是否有委托,是否设置了缓存文件名。

无跟踪:委托设置为 nil。控制器简单 提供对执行 fetch 时数据的访问。

仅内存跟踪:委托非零且文件缓存名称 设置为零。控制器监视其结果集中的对象并 更新部分和订购信息以响应相关 变化。

完全持久跟踪:委托和文件缓存名称是 非零。控制器监视其结果集中的对象并更新 部分和订购信息以响应相关变化。这 控制器维护其结果的持久缓存 计算。

“完全持续跟踪”不是我想要的吗?我设置了cacheName,但它的工作原理相同。

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller nsmanagedobjectcontext nsnotifications


    【解决方案1】:

    我认为 NSFetchedResultController 会持续观察所有变化 商店,是不是希望太大了?

    FRC 仅自动观察其 fetch 返回的对象。这通常不是问题,因为对 FRC 监视的对象的更改应该来自 tableview UI 或背景上下文。在前者中,FRC 会收到更改警报,而在后者中,合并前景和背景上下文将触发 FRC 更新。

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

    NSManagedObjectContextObjectsDidChangeNotification
    

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

    【讨论】:

    • 非常感谢您对我的问题的回答和编辑,但我发现 CoreData DOES full repository tracking" 通过创建新的测试项目进行测试。
    • 如果有我的错误,我正在调试我的项目。
    【解决方案2】:

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

    CoreData 对整个持久存储进行全面跟踪。

    这意味着,如果有新的对象适合 NSFetchedResultsController 的谓词,delegate 会通知它。

    【讨论】:

    • 否,上下文通知 FRC,因为 FRC 已向上下文注册以接收插入、更新和删除通知。如果您进行了 FRC 上下文不知道的更改,则不会跟踪它。例如。另一个线程上的上下文进行了未与 FRC 上下文合并的更改。 FRC 正在跟踪上下文而不是持久存储。
    • 啊,谢谢。你的意思是改变不是整个持久存储,而是在整个数据上下文中,我明白了。
    • 我的问题是,不在 FRC 结果中的对象更改未通知委托。
    • 有什么方法可以告诉 FRC 也观察托管对象的嵌套属性?
    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多