SwiftUI 2.0 Xcode 12 如何正确更新Core Data实体单个属性实现计数重置
ViewModel 绑定重置方法实现问题
需求说明
需要在ViewModel中实现一个可被View按钮点击动作绑定的重置方法,触发后需要达成两个目标:
- 所有关联视图能够同步更新展示内容
- 变更内容可完成Core Data持久化存储
核心重置规则是:将所有存储的WindowCounter实体的qty属性重置为0,同时联动更新所有关联的计数、小计项。
当前ViewModel已定义的核心属性
var viewContext: NSManagedObjectContext { PersistenceController.shared.container.viewContext } @Published var price: Double @Published var qty: Int @Published var subtotal: Double
已尝试的实现代码
当前自写的resetAllSubtotals方法存在逻辑缺陷,无法满足视图同步刷新的要求,代码如下:
func resetAllSubtotals(){ let allCounters: NSFetchRequest<WindowCounter> = WindowCounter.fetchRequest() do { let savedWindowCounters = try self.viewContext.fetch(allCounters) for counter in savedWindowCounters { counter.qty = 0 } try self.viewContext.save() } catch { print(error.localizedDescription) } }
实现缺陷说明
原有实现的核心问题是仅修改了Core Data存储层的实体值,没有同步更新ViewModel中带@Published标记的绑定属性,导致View无法通过绑定收到变更通知,出现视图不刷新的问题。修正逻辑需要补充三个关键环节:
- 遍历重置所有
WindowCounter实体的qty值后,重新计算全局总计数、总小计值 - 将计算完成的最新值同步赋值给ViewModel的
@Published属性,主动触发视图绑定更新 - 统一调用上下文保存方法完成持久化,异常场景下打印错误日志
内容的提问来源于stack exchange,提问作者Mike Haslam
相关产品推荐
相关产品推荐

