核心数据 - 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 有

大数据核心技术都有哪些

哪里不使用核心数据?是不是可以将核心数据用作 MySql 之类的数据库?

使用 MKMapView、核心位置和核心数据

大数据三大核心技术:拿数据、算数据、卖数据!