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

我们正在将项目转换为使用Realm。 到目前为止,我们留下了深刻的印象,特别是Realm浏览器(非常方便!)。

因此,有几个问题出现了,我们希望在进一步研究之前得到一些具体的使用模式。 我们的应用程序是multithreading(API调用,animation等),因此在阅读问题时请记住,因为我知道Realm实例不能跨线程(当前)访问。

  • 我们应该如何担心重复创buildRealm的实例? 什么是开销?
  • 我们是否应该在ViewControllers或Singletons中保留Realm实例来重复使用? 我们已经尝试过,但有时实例是从不同的线程访问的,所以我们不得不每次都恢复创build一个新的实例。
  • 访问Realm实例上的关系属性时,读取的结果数据是保留在内存中还是每次从磁盘读取? 我们是否担心由于深层关系访问而导致保留的Realm实例变得太大?
  • 什么时候刷新一个Realm实例是必要的? 我注意到,当我在Realm浏览器中进行更改时,它们在不调用刷新的情况下反映在保留的Realm中。
    • 看起来像在每个领域有一个自动刷新属性,根据文档导致这一点。
  • 正在访问Object不良做法的realm属性? 如果使用该对象的函数没有创build对象或领域(当然是在同一个线程上),我们已经用它来写入领域。

例如…

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

提前致谢。 我期待着你的回答。 :d

(免责声明:我为Realm工作:))非常感谢! 听到你在享受境界真是太好了!

多个领域实例 – 你根本不用担心这个问题! Realm文件对象是在每个线程的第一次实例化时创build的,并且随后每次尝试实例化该实例时都会返回相同的对象。

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

访问领域关系属性 – 严格来说,来自Realm文件的数据不会从磁盘复制(与正常的ORM一样); 更多的是使用内存映射直接将数据从磁盘引用到内存中的属性。 所以,不,你不需要担心Realm文件在内存中变得太大。

自动刷新 自动刷新仅在主线程上为Realm文件对象默认启用。 必须手动为其他线程上的Realm文件对象启用,否则可以select使用refresh方法调用手动刷新它们。

编辑:我站在纠正! 所有在multithreading上的Realm文件对象默认情况下autorefresh 。 当autorefresh打开时,唯一需要调用refresh是在运行循环的当前迭代完成之前,需要将对Realm文件所做的更改反映到其他引用中。

引用一个对象的领域引用绝对不是,这不是一个坏习惯! 我更喜欢在我自己的个人应用程序中使用Realm来提供正确的上下文,因为总是更容易,并且在代码中的对象与其父领域文件之间提供更强的可视化上下文。 (哈哈,如果这里存在线程问题,那么在达到write点之前,您可能会发现它)。


我希望有帮助! 让我知道,如果你需要澄清这里的任何事情!