RealmSwift使用@ObservedResults添加子对象报RLMArray写事务错误求助
问题根因
Realm 为 SwiftUI 提供的 @ObservedResults 包装器返回的查询结果、以及结果包含的所有对象默认都是冻结状态的,这类对象仅用于界面读取展示,不支持直接修改。你从 parents 集合中直接取出的 parent 实例是冻结对象,哪怕操作逻辑包裹在 realm.write 写事务中,操作的仍然是不可修改的冻结实例,所以会触发 RLMArray 无法在写事务外修改的报错。
解决方案
无需修改模型定义,只需要调整「Create child」按钮的逻辑,在拿到父对象后先调用 thaw() 方法获取 Realm 中对应的活跃可修改实例,再操作子对象数组即可,修改后的代码如下:
Button("Create child") { guard let parent = parents.first, // 解冻获取当前Realm中的活跃可修改父对象 let liveParent = parent.thaw() else { return } let realm = try! Realm() try! realm.write { let child = Child(id: liveParent.children.count + 1, name: "Foo") liveParent.children.append(child) } }
如果你的项目使用了非默认的 Realm 配置,也可以通过 parent.thaw(for: 对应Realm实例) 的方式指定对应的 Realm 进行解冻。
内容的提问来源于stack exchange,提问作者nrj
相关产品推荐
相关产品推荐

