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,提问作者Артем Воробьев
相关产品推荐
相关产品推荐

