iOS MVVM模式中Model如何向ViewModel通知自身变更?
结论
你当前编写的代码中,Model没有主动向ViewModel发送自身变更的通知,所有Model的修改都是由ViewModel主动发起的,变更通知的来源是ViewModel层的Observable包装类,而非Model本身。
结合代码的详细解释
各层角色对应
- Model:
Person结构体,仅作为纯数据载体,没有内置任何变更通知逻辑 - ViewModel:
MyViewModel结构体,持有包装了Model实例的Observable<Person>对象 - 绑定工具:自定义的
Observable<T>泛型类,通过属性观察器didSet监听自身持有的值的变更,向订阅方发送通知
当前的变更触发流程
你现有代码的唯一变更路径是:
- 外部(比如View层交互)调用ViewModel的
changePersonName方法 - ViewModel主动修改
person.value(即持有的Model实例)的属性 - 因为
Person是值类型,修改它的属性等价于给Observable.value重新赋值,触发Observable的didSet属性观察器 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
相关产品推荐
相关产品推荐

