正确的 Realm 使用 patterns/best 做法?
Proper Realm usage patterns/best practices?
我们正在将项目转换为使用 Realm。到目前为止,我们印象深刻,尤其是 Realm 浏览器(太方便了!)。
因此,出现了一些问题,我们希望在进一步讨论之前了解一些具体的使用模式。我们的应用程序是大量多线程的(API 调用、动画等),因此在阅读问题时请记住这一点,因为我知道无法跨线程访问 Realm 实例(目前)。
- 我们应该多担心重复创建 Realm 的实例?开销是多少?
- 我们是否应该费心在 ViewController 或单例中保留 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
(免责声明:我为 Realm 工作。我现在已经离开 Realm,但我仍然很乐意提供帮助!):)
非常感谢!很高兴听到您喜欢 Realm!
多个领域实例 -
你根本不需要担心这个!一个 Realm 文件对象是在每个线程上首次实例化时创建的,之后每次您尝试实例化它时都会返回相同的对象。
保留领域实例 -
从第一点开始,不,你不需要担心挂在其他对象内部的 Realm 引用上。由于 Realm 在内部跟踪其 Realm 文件对象并且 returns 相同,您不会因为不这样做而受到惩罚。话虽这么说,如果在对象内部永久引用 Realm 对象可以简化代码的复杂性,请继续使用它。
访问领域关系属性 -
严格来说,Realm 文件中的数据不是从磁盘复制的(就像普通的 ORM 那样);更多它使用内存映射直接将数据从磁盘直接引用到内存中的属性。所以,不,您不必担心 Realm 文件在内存中变得太大。
自动刷新
默认情况下,仅对主线程上的 Realm 文件对象启用自动刷新。必须为其他线程上的 Realm 文件对象手动启用它,或者您可以选择使用 refresh
方法调用手动刷新它们。
编辑:我同意!默认情况下,多线程上的所有 Realm 文件对象都启用 autorefresh
。当 autorefresh
开启时,您唯一需要调用 refresh
的时间是您需要在 运行 的当前迭代之前将对 Realm 文件所做的更改反映在其他引用中循环已完成。
引用对象的领域引用
绝对不是,这根本不是坏习惯!我实际上更喜欢在我自己的个人应用程序中这样做,这些应用程序使用 Realm 来提供适当的上下文,因为它总是更容易,并且在代码中的对象和它的父 Realm 文件之间提供更强的视觉上下文。 (哈哈,是的,如果这里有线程问题,你可能会在到达 write
点之前发现它)。
希望对您有所帮助!如果您需要在这里澄清任何事情,请告诉我!
我们正在将项目转换为使用 Realm。到目前为止,我们印象深刻,尤其是 Realm 浏览器(太方便了!)。
因此,出现了一些问题,我们希望在进一步讨论之前了解一些具体的使用模式。我们的应用程序是大量多线程的(API 调用、动画等),因此在阅读问题时请记住这一点,因为我知道无法跨线程访问 Realm 实例(目前)。
- 我们应该多担心重复创建 Realm 的实例?开销是多少?
- 我们是否应该费心在 ViewController 或单例中保留 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
(免责声明:我为 Realm 工作。我现在已经离开 Realm,但我仍然很乐意提供帮助!):)
非常感谢!很高兴听到您喜欢 Realm!
多个领域实例 - 你根本不需要担心这个!一个 Realm 文件对象是在每个线程上首次实例化时创建的,之后每次您尝试实例化它时都会返回相同的对象。
保留领域实例 - 从第一点开始,不,你不需要担心挂在其他对象内部的 Realm 引用上。由于 Realm 在内部跟踪其 Realm 文件对象并且 returns 相同,您不会因为不这样做而受到惩罚。话虽这么说,如果在对象内部永久引用 Realm 对象可以简化代码的复杂性,请继续使用它。
访问领域关系属性 - 严格来说,Realm 文件中的数据不是从磁盘复制的(就像普通的 ORM 那样);更多它使用内存映射直接将数据从磁盘直接引用到内存中的属性。所以,不,您不必担心 Realm 文件在内存中变得太大。
自动刷新
默认情况下,仅对主线程上的 Realm 文件对象启用自动刷新。必须为其他线程上的 Realm 文件对象手动启用它,或者您可以选择使用 refresh
方法调用手动刷新它们。
编辑:我同意!默认情况下,多线程上的所有 Realm 文件对象都启用 autorefresh
。当 autorefresh
开启时,您唯一需要调用 refresh
的时间是您需要在 运行 的当前迭代之前将对 Realm 文件所做的更改反映在其他引用中循环已完成。
引用对象的领域引用
绝对不是,这根本不是坏习惯!我实际上更喜欢在我自己的个人应用程序中这样做,这些应用程序使用 Realm 来提供适当的上下文,因为它总是更容易,并且在代码中的对象和它的父 Realm 文件之间提供更强的视觉上下文。 (哈哈,是的,如果这里有线程问题,你可能会在到达 write
点之前发现它)。
希望对您有所帮助!如果您需要在这里澄清任何事情,请告诉我!