Cocoa的MVC用到的模式有:组合(Composite)、命令(Command)、中介者(Mediator)、策略(Strategy)和观察者(Observer)
组合:视图对象之间以协作的方式构成一个视图层次体系,其中既可以有复合视图(如表格视图),也可以有独立视图(如文本框)。每个层次的视图节点都可以响应用户操作并把自己绘制到屏幕上。命令:“目标-动作”机制,视图对象可以推迟其他对象(比如控制器的执行)的执行,让其他对象发生了某些事件后执行。这是命令模式。中介者:控制器对象起着中间人的作用,而这个中间人则采用了中介者模式,构成了视图和模型对象间传递数据的双向渠道。控制器对象将模型的变更传递给视图对象。策略:控制器可以是视图对象的一个 “策略”。视图对象将自身隔离,以期维持其作为数据展示器的唯一职责,而将一切应用程序特有的界面行为决定委托给它的“策略”对象。观察者:模型对象向它所关注的控制器等对象发出内部状态变化的通知。 三者之间的通信只能实现Controller和Model以及Controller和View之间的通信,两者作为Controller的属性。坚决不能有Model和View之间的通信,否则失去了分离的意义。正常情况下是Controller控制View和Model,但View和Model也可以实现对Controller的反向通信。View通过以下三种方式实现与Controller的通信 action-target:用户与UI交互触发控制器。例如点击按钮实现页面跳转,网络请求。delegate:View向Controller询问自己无法决定的事情或让Controller帮助自己做一些无法独立完成的事情。例如表格视图询问Controller自己是否可以滚动,如果Model数据量很少,Controller告诉表格不可以滚动;若还有未拉出的数据,则Controller告知可以滚动。dataSource:视图让控制器给它将要显示的数据。(Controller从Model中获取数据) Model通过以下两种方式实现与Controller的通信: Notification:控制器注册监听某模型数据变化的广播频道,当此模型数据变化后向该控制器发送广播,告知模型变化情况。KVO机制:模型作为控制器的属性,当模型属性被修改后,持有此模型属性的控制器就会收到通知。 多个MVC的结合,例如可以在标签栏中设置多个标签,每个标签指针指向一个MVC。一个小的MVC可作为一个大MVC的V。一个大的model可以有多个小的MVC。MVVM比起MVC最大的好处就是可以实现自动绑定,将数据绑定在UI组件上,当UI中的值发生变化时,那么它对应的模型中也跟随着发生变化,这就是双向绑定机制,原因在于它在视图层和数据模型层之间实现了一个绑定器,绑定器可以管理两个值,它一直监听组件UI的值,只要发生变化,它将会把值传输过去改变model中的值。绑定器比较灵活,还可以实现单向绑定。
实际开发中的做法:让Controller拥有View和ViewModel属性,VM拥有Model属性;Controller或者View来接收ViewModel发送的Model改变的通知用户的操作点击或者Controller的视图生命周期里面让ViewModel去执行请求,请求完成后ViewModel将返回数据模型化并保存,从而更新了Model;Controller和View是属于V部分,即实现V改变M(V绑定M)。如果不需要请求,这直接修改Model就是了。第2步中的Model的改变,VM是知道的(因为持有关系),只需要Model改变后发一个通知;Controller或View接收到通知后(一般是Controller先接收再赋值给View),根据这个新Model去改变视图就完成了M改变V(M绑定V) 使用RAC(RactiveCocoa)框架实现绑定可以简单到一句话概括:ViewModel中创建好请求的信号RACSignal, Controller中订阅这个信号,在ViewModel完成请求后订阅者调用sendNext:方法,Controller里面订阅时写的block就收到回调了。