【问题标题】:Detach an Object from a Realm?从领域中分离对象?
【发布时间】:2015-07-29 17:23:20
【问题描述】:

假设我有以下情况......

ViewController1 从主线程的 Realm 加载一个 Person 对象并将其传递给 ViewController2ViewController2 中的用户交互会导致相同的 Person 对象发生更改,但我只想在用户按下“保存”后保留更改。

目前,当更改ViewController2 中传递的Person 对象时,会引发运行时错误,说明需要在写入块中对对象进行更改。这是有道理的,但在这种情况下,我实际上并不想立即保留更改。

  • 有没有办法从领域中分离对象以避免这些 检查?
  • 如果没有,建议的解决方法是什么? (将 Object 复制到新实例?单独跟踪 Object 的更改并稍后应用它们?两者看起来都非常混乱。)

【问题讨论】:

  • 看这里:realm.io/docs/swift/latest 在“更新对象”部分,如果你有一个主键,你可以使用Realm().add(_:update:)。因此,您似乎已经重新创建了该对象,并且当您想要保存它时执行写入事务并执行更新。
  • 感谢 Ixx,这与我遇到的问题相同。我的对象相当大(很多字段),我不想每次都将它全部复制到一个新对象中。 :(
  • 可以理解...我也对答案感兴趣:)

标签: ios swift realm


【解决方案1】:

现在,您可以通过 Object(value: existingObject) 为您的对象制作一个“独立”副本——这可能是目前最简单的解决方案,直到 Realm 添加类似嵌套事务之类的东西,这将使 undoing 成为任意数量的更改更容易。

【讨论】:

  • 这是 Swift 中从现有对象初始化新对象的一种方式吗? OC有没有类似的方法?
  • 根据当前测试,这会分离对象,但不会分离相关对象 - 尝试从一对多关系修改相关对象仍然显示“尝试在写入之外修改对象交易”
  • 请注意该对象是原始对象的浅拷贝
【解决方案2】:

Realm 在 RealmSwift 5.+ 版本中为 Realm 对象添加了 freeze() 函数。

假设我们有一个带有属性名称的领域对象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 版本的问题中反复提到的那样。现在,远离它。使用深度复制。

【讨论】:

  • 如何进行深拷贝?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多