适当的领域使用模式/最佳实践?

时间:2015-07-23 14:44:16

标签: ios swift realm

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

结果,出现了一些问题,我们希望在继续前进之前先了解一些具体的使用模式。我们的应用程序是多线程(API调用,动画等),因此在阅读问题时请记住这一点,因为我知道不能跨线程(当前)访问Realm实例。

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

例如......

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

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

1 个答案:

答案 0 :(得分:79)

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

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

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

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

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

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

引用对象的Realm引用 绝对不是,这一点都不错!我实际上更喜欢在我自己的个人应用程序中执行此操作,这些应用程序使用Realm来提供正确的上下文,因为它总是更容易,并且在代码中提供对象及其父Realm文件之间更强的可视上下文。 (哈哈,是的,如果这里存在线程问题,你可能会在到达write点之前发现它。)

我希望有所帮助!如果您需要澄清任何内容,请告诉我们!