【问题标题】:Realm over CoreData should I use NSFetchedResultController or a Dictionary?我应该使用 NSFetchedResultController 还是字典?
【发布时间】:2016-01-27 07:27:23
【问题描述】:

我正在使用 Core Data 和 NSFetchedResultController 开发一个应用程序,但出于多种原因,我想将其切换为使用 Realm。 我看到 github 上有 NSFetchedResultController 的“Realm 版本”,但它与我当前使用 Core Data 的代码不兼容。

视图控制器正在显示来自同一所学校的人员列表,就像地址簿一样。 此列表是在同一城市学习的人员的子列表。

所以我想向数据库发出 1 个唯一请求以检索所有人的列表,然后在每所学校 [String: AnyObject] 的 1 个字典中本地过滤此列表,其中 String 作为 tableView 中的部分名称,AnyObject 是一个数组人。

  1. 第一个解决方案,为每个学校制作一个 NSFetchedResultController,并使用谓词过滤位置。然后所有删除操作等都由代表处理 -> 这与 Realm 不兼容

  2. 创建这些字典并为每个操作更新它们... -> 这适用于 Realm,但编写代码非常烦人。

有更好的解决方案吗?

编辑:

我需要澄清我的要求: 我想写一个继承 UITableViewController 的类。

  • 这个类有一个按字母顺序排列的人员列表
  • tableview 的部分包含其名字的第一个字母
  • tableview 控制器需要处理数据模型的更新(插入、更新、删除)

由于我们可能会从 CoreData 迁移到 Realm,因此我想编写与两者兼容的代码,以便以后无需再次修改它。到目前为止,我发现这样做的唯一“聪明”方法是忘记 NSFetchedResultController 和 RBQFetchedResultsController,因为它们分别链接到 CoreData 和 Realm,然后使用像字典这样的数据结构。

【问题讨论】:

  • 也许我没有完全理解这个问题,但是如何编写一个函数来接收您想要的学校并从该学校的核心数据中获取人员? (或者这对你不起作用?)
  • 我想要一个 NSFetchedResultController 但在字典上,而不是数据库上。然后我可以从任何来源加载数据并在我的 ViewController 中发出本地请求。

标签: ios objective-c swift core-data realm


【解决方案1】:

澄清一下,您正在创建一个包含多个部分的UITableView;每所学校 1 个,并且您想根据他们的学校将 Realm 数据库中人员的平面列表排序到表中,对吗?

如果您提到的 Realm 获取结果控制器(我猜它是 RBQFetchedResultsController)不适合您的应用程序架构,那么是的,字典将是可行的方法,但它不应该像“手动”那样'如你所想。

Realm Results 对象的好处是它们是“活的”,因为如果在进行 Results 查询之后将新项目添加到 Realm,它将被追溯更新以包含新的物品。在这种情况下,只要您管理一个包含Results 对象的字典,每个对象都与获取每个特定学校的人员相关,那么唯一的手动方面就是管理表格部分本身。

唯一需要注意的是,您需要一种机制来在新人被添加到特定学校时收到通知(以便知道刷新表格视图的该部分),但现在,如果您按照自己的逻辑(通过回调块或委托调用)执行此操作,那将是最好的。

顺便说一句,我们正在添加一组新的 API,以便在 Realm 中实现本机获取结果控制器行为(即,在添加新对象时自动发布通知)。我们还没有确定正确的发布日期,但应该是在 2016 年第一季度! :)

【讨论】:

  • 我真的很喜欢你的旁注 :)
  • Realm 对象通知更改非常有趣。我会看看它。目前,关于答案,似乎很难为 CD 和 Realm 创建一个抽象层,所以我想我将不得不使用 NSFetchedResultController 和更多的方法,直到我看到旁注成为现实:) 然后我会接受回答。
  • 在变更通知发布后如何更新?我注意到文档将部分硬编码为零,并且 API 似乎假设在数据级别没有部分的概念。是否可以通过新的 Realm 过滤和更改通知支持以任何方式实现部分?
猜你喜欢
  • 2012-05-18
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多