我们正在将项目转换为使用Realm。到目前为止,我们给Realm浏览器留下了非常深刻的印象(非常方便!)。
结果,出现了一些问题,我们希望在继续前进之前先了解一些具体的使用模式。我们的应用程序是多线程(API调用,动画等),因此在阅读问题时请记住这一点,因为我知道不能跨线程(当前)访问Realm实例。
realm
不良做法上访问Object
属性?如果使用该对象的函数没有创建对象或Realm(当然在同一个线程上),我们已经使用它来写入Realm。例如......
func saveStuff(thingToUpdate: Object?) {
if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm {
realm.write {
thingToUpdate.name = "lionpants"
}
}
}
提前致谢。我期待着你的回答。 :d
答案 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
点之前发现它。)
我希望有所帮助!如果您需要澄清任何内容,请告诉我们!