Realm Swift模型是否分开?

Rob*_*212 18 realm ios swift

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

现在我想坚持某些实体,并想知道我是否应该为我的每个实体创建新的Realm特定模型来从Realm读取和写入.或者我应该将所有现有的普通Swift实体转换为Realm实体.起初这感觉不对,因为我会在我的应用程序中传递Realm Entities,而不仅仅是在持久层中.

但是,另一种方法是,每次我向Realm读/写实体时,我都需要将它们从实体转换为Realm实体.

有关最佳方法的任何建议吗?

谢谢

mar*_*ius 32

这两种策略都很好,各有利弊.

值对象+领域对象

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

仅使用Realm对象

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

TL; DR

选择退出Realm Objects时会丢失许多Realm功能,并且很难自己重新实现它们.根据您需要多少这些以及您的用例如何,您将以高成本购买线程安全.

从长远来看,我们正致力于使Realm对象更容易使用,并试图消除它们的缺点,因此长期了解这些对象将有助于做出明智的决定.

  • 这个答案缺少直接使用Realm对象或通过值类型/代理间接操作之间最关键的区别.1)从数据库延迟加载领域对象,这意味着更少的磁盘读取和更少的内存复制.2)领域对象是零拷贝,这意味着从它们读取更便宜.3)领域对象是"实时"的,这意味着它们的数据始终是最新的.4)领域对象具有丰富的对象图,在内存中复制将是困难且昂贵的.TL;博士; 选择退出Realm对象时会丢失许多Realm功能 (8认同)

小智 5

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