【问题标题】:Realm Swift Models separate or not?Realm Swift 模型是否分开?
【发布时间】:2016-01-22 09:46:37
【问题描述】:

我是 iOS 和 Swift 世界的新手,我正在开发一个新应用程序,我想使用 Realm 来实现持久性。我的代码中已经有实体,我的服务可以访问并填充 HTTP API 端点。

现在我想保留某些实体,并希望获得有关我是否应该为我的每个实体创建新的 Realm 特定模型以从 Realm 读取和写入的建议。或者我应该将所有现有的普通 Swift 实体转换为领域实体。起初这感觉不对,因为我会在我的应用程序周围传递 Realm 实体,而不仅仅是在持久层中。

但是,另一种方法是每次我将实体读/写到领域时,我都需要将它们从实体到领域实体来回转换。

关于最佳方法的任何建议?

谢谢

【问题讨论】:

  • 我会选择那些我真正想要持久化的实体,并将它们设为 Realm 对象。仅使用领域对象来存储或在控制器之间传递等是可以且非常理想的。

标签: ios swift realm


【解决方案1】:

这两种策略都很好,各有优缺点。

值对象 + 领域对象

  • ✅ 值对象是线程安全的
  • ✅ 值对象可以在任何地方进行变异,无需担心副作用
  • ✅ 值对象可以任意定义,并允许使用语言的全部可能性,从而可以解决对象持久性映射给出的约束
  • ❗️ 没有延迟加载,这意味着必须将完整的对象层次结构加载到内存中
  • ❗️ 无法表达周期
  • ❗️ 需要维护您的模型定义两次
  • ❗️ 需要将传输编码(例如 JSON)映射到 Swift Struct 以及从这些映射到 Realm 对象的逻辑

仅使用领域对象

  • ✅ 零拷贝,这意味着读取它们的成本更低
  • ✅ 实时,这意味着他们的数据始终是最新的
  • ✅ 从数据库延迟加载:更少的磁盘读取
  • ✅ 可以表示循环和任意对象层次结构
  • ✅ 在一处定义您的模型
  • ✅ 如果您可以控制传输编码并且可以共享命名约定,那么您可以主要依赖于 create(_:update:_) 及其朋友使用的 Realm 集成的 Foundation 值类型映射逻辑。
  • ✅ 支持 KVO,可轻松与一些响应式编程框架集成
  • ❗️ 为您定义模型对象的方式添加约束(某些语言结构不直接支持作为枚举,目前需要解决方法)
  • ❗️ 引用类型需要更加注意突变以避免不良副作用,此外,修改只能在写入事务中进行(应尽可能大批量处理)
  • ❗️ 领域对象不是线程安全的

TL;DR

选择退出领域对象时,您会失去许多领域功能,并且很难自己重新实现它们。根据您对这些的需求量以及您的用例的外观,您会以高昂的成本购买线程安全。

从长远来看,我们正在努力使 Realm 对象更易于使用,并尝试消除它们的缺点,所以只要了解它们是什么将有助于做出明智的决定。

【讨论】:

  • 感谢@marius 提供详细且内容丰富的回复。我非常热衷于让模型层不了解持久层,因此我将选择拥有单独的领域和模型实体。尽管有重复的模型,但我认为这最适合我当前的需求。期待与 Realm 合作。
  • 这个答案缺少直接使用 Realm 对象或通过值类型/代理间接操作之间最关键的区别。 1) Realm 对象是从数据库中延迟加载的,这意味着更少的磁盘读取和更少的内存复制。 2) Realm 对象是零拷贝的,这意味着读取它们的成本更低。 3)领域对象是“活的”,这意味着它们的数据总是最新的。 4) Realm 对象有一个丰富的对象图,在内存中复制起来既困难又昂贵。 tl;博士;选择退出 Realm 对象时,您会丢失许多 Realm 功能
  • 我认为这些都是非常好的观点,所以我更新了我的答案以包含它们。
  • 您可以使用 Structify 自动将您的结构转换为 ObjectiveC 类:github.com/arturdev/Structify
【解决方案2】:

在我看来,所有持久性交互都应该在名为 Store/Repository 的类中。如果你想改变你的数据库,它只会影响 Store/Repository 类。我认为应用程序的框架独立性比性能更有价值。如果出现性能问题,您可以使用领域对象,但我认为这种情况非常罕见。

【讨论】:

  • 同意 100%,您最不想做的就是让第 3 方库/依赖项潜入您的应用程序域。例如,我知道 Realm 通知可能听起来很吸引人,但随后它变得如此紧密耦合,以至于您几乎无法更改数据库。
  • 我完全同意。我正在维护一个(Android)应用程序,其中 Realm 与业务逻辑如此耦合,以至于我们至少要花两倍的时间来开发新功能。这需要时间,因为 Realm 的“反应性”只是不断破坏现有功能。此外,为了真正从 Realm 中受益,您最终不仅要耦合实体(从 Realm 对象扩展),还要查询结果(RealmResults),甚至像 RecyclerView 适配器(RealmAdapters)这样的视图控制器。如果我们想将 Realm 换成另一个 DBMS,重写整个应用程序的成本会更低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多