核心数据 - NSManagedObjectContext vs NSFetchedResultsController
Posted
技术标签:
【中文标题】核心数据 - NSManagedObjectContext vs NSFetchedResultsController【英文标题】:Core Data - NSManagedObjectContext vs NSFetchedResultsController 【发布时间】:2012-07-31 23:37:31 【问题描述】:根据NSFetchedResultsController
的苹果文档:
您使用获取的结果控制器来有效地管理结果 从核心数据获取请求返回以提供数据 UITableView 对象。
根据NSManagedObjectContext
的文档:
它的主要职责是管理一个托管集合 对象。
这两个类的目的似乎重叠。两者都“管理获取的托管对象”。也许措辞的差异确实意味着什么,但我不明白。在阅读了这两个文档之后,在我看来,所有数据获取、修改、提交、撤消/重做等都是由托管上下文处理的。我没有看到 nsfrc 存在的意义。
当我们已经有管理上下文来处理数据时,谁能解释为什么我们需要获取结果控制器?
【问题讨论】:
【参考方案1】:NSManagedObjectContext
是核心数据的基本概念,类似于关系数据中的事务。您不仅可以获取对象,还可以创建、更新和删除它们,将它们保存回持久存储等。
您不需要NSFetchedResultsController
。它是一个实用程序类,旨在以一种易于在表格视图中使用的格式提供核心数据对象。 NSFetchedResultsController
中使用的提取对象将由 NSManagedObjectContext
管理。
话虽如此,“实用类”的销量严重不足。它会自动管理底层数据源中的更新、插入和删除、缓存、节等,这些事情手动处理很麻烦。
【讨论】:
所以 MOC 使用获取请求 A 从持久存储中获取一些数据。然后 FRC 使用获取请求 B 从该 MOC 获取数据以提供表视图控制器。 A 和 B 是两个不同的获取请求。对吗?【参考方案2】:NSFetchedResultsController
具有对 NSManagedObjectContext
的引用。
FRC 有责任根据您提供的标准从其 MOC 中获取所有对象并对其进行排序。
FRC 是一个实用程序类,用于处理来自给定 MOC 的对象。
例如All People with firstName is 'John', sorted by lastName
如果您将firstName = 'John'
的新人添加到 FRC 引用的 MOC,获取的结果控制器将解决它并发送一个委托回调。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
//do some stuff
NSManagedObjectContext
是一堆东西。 NSFetchedResultsController
是从存储桶中挑选特定事物的一种方式。
【讨论】:
【参考方案3】:获取结果控制器仅获取一个集合并监视它的更改,以便可以自动更新表视图。您实际上并没有直接对NSFetchedResultsController
进行任何更改。它链接到上下文(您可以在其中进行更改)和结果集。
【讨论】:
你能具体说明每个“它”指的是什么吗?我不明白你。 it = NSFetchedResultsController以上是关于核心数据 - NSManagedObjectContext vs NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章
过滤后的 SwiftUI CoreData 列表中的 Sum 属性
在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有