You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 03:54:00