从领域中分离对象?

Detach an Object from a Realm?

假设我有以下场景...

ViewController1 从主线程上的 Realm 加载一个 Person 对象并将其传递给 ViewController2ViewController2 中的用户交互导致相同的 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 版本的问题中反复提到的那样。现在,远离它。使用深度复制。