从领域中分离对象?
Detach an Object from a Realm?
假设我有以下场景...
ViewController1
从主线程上的 Realm 加载一个 Person
对象并将其传递给 ViewController2
。 ViewController2
中的用户交互导致相同的 Person
对象发生更改,但我只想在用户按下 "Save" 后保留更改。
目前,当更改 ViewController2
中传递的 Person
对象时,会抛出运行时错误,指出需要在 Write 块中对对象进行更改。这是有道理的,但在这种情况下,我实际上并不想立即保留更改。
- 有没有办法从领域中分离对象以避免这些
检查?
- 如果没有,建议的解决方法是什么? (将对象复制到新实例?单独跟踪对对象的更改并在以后应用它们?两者看起来都很混乱。)
现在,您可以通过 Object(value: existingObject)
创建对象的 'standalone' 副本——这可能是目前最简单的解决方案,直到 Realm 添加类似嵌套事务的东西使 undo
更容易进行任意数量的更改。
Realm 在 RealmSwift 5.+ 版本上为 Realm 对象添加了 freeze()
函数。
假设我们有一个名称为 属性 的 Realm 对象 Edible
。以前你需要为对象保留一个 ThreadSafeReference
,在另一个线程上获取一个领域并解包引用。嗯
如果你不这样做,它会崩溃:
// Code running on main thread
let edible = realm.objects(Edible.self)[0]
DispatchQueue.global(qos: .background) {
let name = edible.name // Realm accessed from incorrect thread error
}
如何在 RealmSwift 5.+
中分离对象:
let edible = realm.objects(Edible.self)[0].freeze()
DispatchQueue.global(qos: .background) {
let name = edible.name // No longer crashes
}
请记住,截至 2021 年 1 月 11 日,freeze()
函数会产生许多影响用户的未知奇怪错误,正如在新 Realm 版本的问题中反复提到的那样。现在,远离它。使用深度复制。
假设我有以下场景...
ViewController1
从主线程上的 Realm 加载一个 Person
对象并将其传递给 ViewController2
。 ViewController2
中的用户交互导致相同的 Person
对象发生更改,但我只想在用户按下 "Save" 后保留更改。
目前,当更改 ViewController2
中传递的 Person
对象时,会抛出运行时错误,指出需要在 Write 块中对对象进行更改。这是有道理的,但在这种情况下,我实际上并不想立即保留更改。
- 有没有办法从领域中分离对象以避免这些 检查?
- 如果没有,建议的解决方法是什么? (将对象复制到新实例?单独跟踪对对象的更改并在以后应用它们?两者看起来都很混乱。)
现在,您可以通过 Object(value: existingObject)
创建对象的 'standalone' 副本——这可能是目前最简单的解决方案,直到 Realm 添加类似嵌套事务的东西使 undo
更容易进行任意数量的更改。
Realm 在 RealmSwift 5.+ 版本上为 Realm 对象添加了 freeze()
函数。
假设我们有一个名称为 属性 的 Realm 对象 Edible
。以前你需要为对象保留一个 ThreadSafeReference
,在另一个线程上获取一个领域并解包引用。嗯
如果你不这样做,它会崩溃:
// Code running on main thread
let edible = realm.objects(Edible.self)[0]
DispatchQueue.global(qos: .background) {
let name = edible.name // Realm accessed from incorrect thread error
}
如何在 RealmSwift 5.+
中分离对象:
let edible = realm.objects(Edible.self)[0].freeze()
DispatchQueue.global(qos: .background) {
let name = edible.name // No longer crashes
}
请记住,截至 2021 年 1 月 11 日,freeze()
函数会产生许多影响用户的未知奇怪错误,正如在新 Realm 版本的问题中反复提到的那样。现在,远离它。使用深度复制。