我们正在将项目转换为使用 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/