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

iOS MVVM模式中Model如何向ViewModel通知自身变更?

结论

你当前编写的代码中,Model没有主动向ViewModel发送自身变更的通知,所有Model的修改都是由ViewModel主动发起的,变更通知的来源是ViewModel层的Observable包装类,而非Model本身。


结合代码的详细解释

各层角色对应

  • Model:Person 结构体,仅作为纯数据载体,没有内置任何变更通知逻辑
  • ViewModel:MyViewModel 结构体,持有包装了Model实例的Observable<Person>对象
  • 绑定工具:自定义的Observable<T>泛型类,通过属性观察器didSet监听自身持有的值的变更,向订阅方发送通知

当前的变更触发流程

你现有代码的唯一变更路径是:

  1. 外部(比如View层交互)调用ViewModel的changePersonName方法
  2. ViewModel主动修改person.value(即持有的Model实例)的属性
  3. 因为Person是值类型,修改它的属性等价于给Observable.value重新赋值,触发Observable的didSet属性观察器
  4. Observable通知订阅方(也就是View层)更新UI

整个流程里Model全程是被动的,它不知道自己被谁修改,也不会主动给任何对象发送变更通知。你感知到的变更通知完全是ViewModel层的Observable发出的,和Model本身没有关系。

什么是真正的Model向ViewModel发通知?

当Model存在自主变更场景时,才需要主动向ViewModel发送通知,常见场景包括:

  • Model是全局共享的数据源,可能被其他业务模块修改
  • Model内部有自身的业务逻辑,比如Person的年龄到18岁时自动修改身份标签
  • Model绑定了本地数据库、远程实时数据推送,数据变更来自Model层内部

要实现这种能力,你需要把变更通知的能力下沉到Model层:比如将Person改为类类型,内部的name、age属性用@Published修饰,ViewModel主动订阅Model的属性变更,这时候无论任何来源修改了Model的属性,ViewModel都能第一时间收到通知。


内容的提问来源于stack exchange,提问作者naljin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:15:01