ios - 正确的 Realm 使用模式/最佳实践?

标签 ios swift realm

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

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

  • 我们应该多担心重复创建 Realm 的实例?开销是多少?
  • 我们是否应该在 ViewController 或 Singletons 中保留 Realm 实例 重复使用?我们试过这个,但有时实例是从不同的线程访问的,所以我们不得不恢复到每次都创建一个新实例。
  • 访问 Realm 实例上的关系属性时,是 读取的结果数据保留在内存中还是从中读取 每次都打盘?我们是否需要担心保留的 Realm 实例 由于深入的关系访问而变得太大?
  • 什么时候需要刷新 Realm 实例?我注意到当 我在 Realm 浏览器中进行更改,它们反射(reflect)在保留的 不调用刷新的 Realm 。
    • 根据文档,似乎每个 Realm 都有一个自动刷新属性会导致此问题。
  • 访问 Object 上的 realm 属性是不是坏习惯?如果使用对象的函数没有创建对象或 Realm(当然是在同一个线程上),我们就使用它来写入 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 引用上。由于 Realm 在内部跟踪其 Realm 文件对象并返回相同的对象,因此您不会因为不这样做而受到惩罚。话虽这么说,如果在对象内部永久引用 Realm 对象可以简化代码的复杂性,请继续使用它。

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

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

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

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


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

关于ios - 正确的 Realm 使用模式/最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590717/

相关文章:

iphone - 处理 iphone/ipad 图像旋转的正确方法是什么?

ios - View Controller 的最佳组织

ios - 如何测试 iOS 应用程序是否支持 IPv6?

ios - 我的应用程序在尝试设置我的 map View 时崩溃

realm - 如何为 OS X 命令行实用程序构建静态 Realm 库?

c# - 如何在没有文本框的情况下获取键盘事件?

ios - Swift iOS 8 设置透明导航栏和状态栏的Image Underlay

objective-c - 从另一个类实现中获取 CGFloat 实例变量

ios - 一个写事务执行一个对象添加需要多长时间?

ios - 防止在 Realm 中复制对象的最佳方法是什么?