iOS的MVC设计模式和MVVM的异同点以及iOS中如何实现数据绑定

设计模式:MVC

在模型对象(model)中封装数据和基本行为
  • 模型对象维护应用程序的数据,并定义操作数据的特定逻辑。
  • 只要是加载的是包含有应用程序永久信息的数据,就将其放到model中。
  • 理想状况下,模型对象同用于对其进行显示和编辑的用户界面之间不应该有任何直接的关联。
使用视图对象(view)
  • 视图对象可以响应用户操作,并懂得如何将自己展现在屏幕上。
  • 视图对象通常从应用程序的模型对象获取数据用以展示,用户可以通过视图来修改模型对象的数据。
  • 视图对象和模型对象虽然之间关系密切但不没有耦合,除非因为性能原因(比如视图需要对数据进行缓存),否则不应该将视图用于存储其所展示的数据。
控制器对象(Controller)联系起模型和视图
  • 协调视图对象和模型对象,使视图得以知晓模型的变更而给予响应。
  • 还可以为应用程序执行其他操作,比如为应用程序管理其他对象的生命周期,进行设置和协调任务。
作为复合设计模式的MVC:

Cocoa的MVC用到的模式有:组合(Composite)、命令(Command)、中介者(Mediator)、策略(Strategy)和观察者(Observer)

  • 组合:视图对象之间以协作的方式构成一个视图层次体系,其中既可以有复合视图(如表格视图),也可以有独立视图(如文本框)。每个层次的视图节点都可以响应用户操作并把自己绘制到屏幕上。
  • 命令:“目标-动作”机制,视图对象可以推迟其他对象(比如控制器的执行)的执行,让其他对象发生了某些事件后执行。这是命令模式。
  • 中介者:控制器对象起着中间人的作用,而这个中间人则采用了中介者模式,构成了视图和模型对象间传递数据的双向渠道。控制器对象将模型的变更传递给视图对象。
  • 策略:控制器可以是视图对象的一个 “策略”。视图对象将自身隔离,以期维持其作为数据展示器的唯一职责,而将一切应用程序特有的界面行为决定委托给它的“策略”对象。
  • 观察者:模型对象向它所关注的控制器等对象发出内部状态变化的通知。

在这里插入图片描述

  • 三者之间的通信只能实现Controller和Model以及Controller和View之间的通信,两者作为Controller的属性。坚决不能有Model和View之间的通信,否则失去了分离的意义。
  • 正常情况下是Controller控制View和Model,但View和Model也可以实现对Controller的反向通信。
  • View通过以下三种方式实现与Controller的通信
  1. action-target:用户与UI交互触发控制器。例如点击按钮实现页面跳转,网络请求。
  2. delegate:View向Controller询问自己无法决定的事情或让Controller帮助自己做一些无法独立完成的事情。例如表格视图询问Controller自己是否可以滚动,如果Model数据量很少,Controller告诉表格不可以滚动;若还有未拉出的数据,则Controller告知可以滚动。
  3. dataSource:视图让控制器给它将要显示的数据。(Controller从Model中获取数据)
  • Model通过以下两种方式实现与Controller的通信:
  1. Notification:控制器注册监听某模型数据变化的广播频道,当此模型数据变化后向该控制器发送广播,告知模型变化情况。
  2. KVO机制:模型作为控制器的属性,当模型属性被修改后,持有此模型属性的控制器就会收到通知。
  • 多个MVC的结合,例如可以在标签栏中设置多个标签,每个标签指针指向一个MVC。一个小的MVC可作为一个大MVC的V。一个大的model可以有多个小的MVC。

MVVM

MVVM比起MVC最大的好处就是可以实现自动绑定,将数据绑定在UI组件上,当UI中的值发生变化时,那么它对应的模型中也跟随着发生变化,这就是双向绑定机制,原因在于它在视图层和数据模型层之间实现了一个绑定器,绑定器可以管理两个值,它一直监听组件UI的值,只要发生变化,它将会把值传输过去改变model中的值。绑定器比较灵活,还可以实现单向绑定。

  1. 实际开发中的做法:让Controller拥有View和ViewModel属性,VM拥有Model属性;Controller或者View来接收ViewModel发送的Model改变的通知
  2. 用户的操作点击或者Controller的视图生命周期里面让ViewModel去执行请求,请求完成后ViewModel将返回数据模型化并保存,从而更新了Model;Controller和View是属于V部分,即实现V改变M(V绑定M)。如果不需要请求,这直接修改Model就是了。
  3. 第2步中的Model的改变,VM是知道的(因为持有关系),只需要Model改变后发一个通知;Controller或View接收到通知后(一般是Controller先接收再赋值给View),根据这个新Model去改变视图就完成了M改变V(M绑定V)
    使用RAC(RactiveCocoa)框架实现绑定可以简单到一句话概括:ViewModel中创建好请求的信号RACSignal, Controller中订阅这个信号,在ViewModel完成请求后订阅者调用sendNext:方法,Controller里面订阅时写的block就收到回调了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值