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

SwiftUI中如何点击按钮批量更新Realm所有对象的指定属性

Realm批量更新属性实现方案

核心逻辑

@ObservedResults会自动监听Realm数据变更,只要在Realm写入事务中完成属性修改,所有绑定对应数据源的视图会自动触发刷新,不需要手动写跨视图通知逻辑。

前置修复

先修正DWork视图中的绑定变量拼写错误,否则会编译失败:
将现有代码中

@Binding var complite: Int

修改为

@Binding var complete: Int

额外提示:你当前给出的HotelPoint模型中未定义inWork属性,但DWork里的hotelsInWork过滤条件用到了该字段,如果编译报错记得补上对应@Persisted var inWork = false的声明;另外MainView中未使用的@ObservedRealmObject var hotelPointComplete = HotelPoint()可以直接删除,避免不必要的开销。

按钮批量更新代码

你已经通过@Environment(\.realm) var localRealm拿到了当前Realm实例,所有写入操作必须包裹在write事务中,直接替换"Выполнено"按钮的action代码即可:

Button("Выполнено") {
    // 重置计数
    inProcces = 0
    complete = 0
    
    // 执行批量更新
    do {
        try localRealm.write {
            // 查询所有HotelPoint对象,批量将complete属性设为false
            let allHotels = localRealm.objects(HotelPoint.self)
            allHotels.setValue(false, forKey: "complete")
            
            // 如果需要同时重置在途状态,放开下一行代码即可
            // allHotels.setValue(false, forKey: "inWork")
        }
    } catch {
        print("Realm写入错误: \(error.localizedDescription)")
    }
    
    self.dayWork.toggle()
}

效果说明

  • 上述代码用Realm原生批量更新接口实现,性能远高于遍历逐个修改属性,即使数据量较大也不会卡顿
  • 写入完成后DWork视图的hotelsEnded结果集(过滤条件为complete == true)会自动更新,已完成分组下的列表项会自动消失,显示预设的"Доставь завтраки"占位文本,自动完成跨视图联动
  • 如果后续不需要全表更新,只需要修改已完成状态的对象,把查询条件替换为带过滤的结果集即可:
    let completedHotels = localRealm.objects(HotelPoint.self).where { $0.complete == true }
    completedHotels.setValue(false, forKey: "complete")
    

内容的提问来源于stack exchange,提问作者Артем Воробьев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:33:12