【问题标题】:Realm Swift2: Best practice for model and Realm model class separationRealm Swift2:模型与 Realm 模型类分离的最佳实践
【发布时间】:2016-02-09 02:55:25
【问题描述】:

我刚刚开始使用 Realm for Swift。阅读文档后,我仍然有几个问号。

我最大的问题是,如果有将模型类与领域类分离的最佳实践。

例如,在 Java MVC 项目中,我们使用了负责与数据库层通信的 DAO 类(数据访问对象类)。 我们对应的模型类要么只注入了 dao 对象,要么为此使用了服务类(如 CRUD 操作)。

如果我拥有一个 Realm“模型”类,现在这似乎是一切合二为一。但是在将对象持久化到数据库之后,在 UI 层中更改对象的属性会导致

'试图在写事务之外修改对象 - 调用 首先在 RLMRealm 实例上开始写事务。'

这让我回到了我最初的想法:这不应该在 Realm 对象和模型对象中分开吗?或者在 View-Classes 中有“realm.write”进程是否可以?

我对此进行了一些研究,但结果对此非常模糊。

您如何在您的项目中处理这个问题。您有某种最佳做法或指导吗?

非常感谢提前 约翰

【问题讨论】:

  • 0 反对票 有趣的是你现在应该问这个问题 - 我刚刚开始将领域数据库对象分离到它们自己的空间中并创建你的 DAO 的等价物,所以我的应用程序直接与 DAO 对话,它们调用适当的领域方法。大约一天前才开始,所以会回来报告...

标签: swift2 realm


【解决方案1】:

正式地说,(至少在 iOS 端),没有既定的最佳实践将模型类逻辑从实际的 Realm Object 子类中抽象出来。话虽如此,我过去肯定听说过使用这种逻辑来支持多种类型的数据框架的应用程序。

如果我要这样做,我将为每个模型创建一个单独的对象类,实现我自己的关于如何获取/设置数据属性的 API,并使 Realm 对象成为该对象的内部成员。然后,该对象将用作我的应用程序逻辑与如何将该数据保存到 Realm 之间的通用接口。那样的话,如果我真的想换掉数据框架,我可以简单地用一个新的数据对象替换我自己的数据对象,但要保持 API 一致。

关于您发布的错误消息,为了确保数据完整性,您不能修改 Realm 对象(UI 线程或其他),除非它在写入事务中。话虽如此,您可以在该抽象对象中轻松封装该逻辑(即在当前线程上打开 Realm 写入事务)。

【讨论】:

  • 谢谢蒂姆。这对我很有帮助。您所描述的是我个人在分离层方面更喜欢的。干杯,约翰
  • 您好@TiM,您能否解释一下您所说的使Realm 对象成为该对象的内部成员 是什么意思?如果你有时间,一个非常简单的例子也很好。
  • 你好@Isuru!哦,哇,这是一个老问题!我的意思是,由于您无法在写入事务之外修改 Realm Object 实例,因此您将使用包装类来隔离特定于 Realm 的逻辑。您将拥有一个与您的应用程序照常交互的通用模型对象,但该对象本身在内部保留等效的 Realm Object 并单独执行所有 Realm 逻辑。这里的目标是能够删除 Realm 并插入另一个数据库引擎,而根本不需要更改类的设计。 :)
  • @TiM 我从我收集到的东西中想出了一些东西,但我仍然有一些疑问。我提出了一个新问题here,如果您愿意看一下。
  • @TiM 好的,重新阅读您的答案消除了我的一个疑问。您正在为 Realm 模型类的属性在包装类中创建自己的 getter 和 setter。因此,如果/当您必须实例化此 Realm 对象的实例时,您会直接执行吗?还是通过包装类?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
相关资源
最近更新 更多