正确的 Realm 使用 patterns/best 做法?

Proper Realm usage patterns/best practices?

我们正在将项目转换为使用 Realm。到目前为止,我们印象深刻,尤其是 Realm 浏览器(太方便了!)。

因此,出现了一些问题,我们希望在进一步讨论之前了解一些具体的使用模式。我们的应用程序是大量多线程的(API 调用、动画等),因此在阅读问题时请记住这一点,因为我知道无法跨线程访问 Realm 实例(目前)。

例如...

func saveStuff(thingToUpdate: Object?) {
   if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm {
       realm.write {
           thingToUpdate.name = "lionpants"
       }
   }    
}

提前致谢。我期待着您的回答。 :D

(免责声明:我为 Realm 工作。我现在已经离开 Realm,但我仍然很乐意提供帮助!):) 非常感谢!很高兴听到您喜欢 Realm!

多个领域实例 - 你根本不需要担心这个!一个 Realm 文件对象是在每个线程上首次实例化时创建的,之后每次您尝试实例化它时都会返回相同的对象。

保留领域实例 - 从第一点开始,不,你不需要担心挂在其他对象内部的 Realm 引用上。由于 Realm 在内部跟踪其 Realm 文件对象并且 returns 相同,您不会因为不这样做而受到惩罚。话虽这么说,如果在对象内部永久引用 Realm 对象可以简化代码的复杂性,请继续使用它。

访问领域关系属性 - 严格来说,Realm 文件中的数据不是从磁盘复制的(就像普通的 ORM 那样);更多它使用内存映射直接将数据从磁盘直接引用到内存中的属性。所以,不,您不必担心 Realm 文件在内存中变得太大。

自动刷新 默认情况下,仅对主线程上的 Realm 文件对象启用自动刷新。必须为其他线程上的 Realm 文件对象手动启用它,或者您可以选择使用 refresh 方法调用手动刷新它们。

编辑:我同意!默认情况下,多线程上的所有 Realm 文件对象都启用 autorefresh。当 autorefresh 开启时,您唯一需要调用 refresh 的时间是您需要在 运行 的当前迭代之前将对 Realm 文件所做的更改反映在其他引用中循环已完成。

引用对象的领域引用 绝对不是,这根本不是坏习惯!我实际上更喜欢在我自己的个人应用程序中这样做,这些应用程序使用 Realm 来提供适当的上下文,因为它总是更容易,并且在代码中的对象和它的父 Realm 文件之间提供更强的视觉上下文。 (哈哈,是的,如果这里有线程问题,你可能会在到达 write 点之前发现它)。


希望对您有所帮助!如果您需要在这里澄清任何事情,请告诉我!