随着业务规模的扩大,业务逻辑变得越来越复杂。这样controller中的代码越来越多,传统的MVC架构以及很难满足低耦合,高内聚的设计要求。为了解决这个问题,就提出了MVVM模式。MVVM模式是基于MVC的,最直观的特点是在View和Model之间多加了一层ViewModel来实现数据绑定,从而减轻Controller的压力。图1-1展示了MVVM设计模式的结构
MVVM中的ViewModel有以下几个特点:
1.viewmodel是有状态的。viewmodel有自己的属性,还会持有model对象
2.viewmodel与UI控件的无关性。viewmodel并不关心UI控件的相关逻辑,只关心自己的数据处理逻辑
3.易于单元测试。
4.viewmodel可以抽离出来做转换器给其他项目使用,从而最大程度上实现了代码的复用。
MVVM设计模式的目的是帮助MVC设计模式中的Controller瘦身,将数据加工的任务从Controller中解放出来,使得Controller只需要专注于业务分配工作,让MVVM中的ViewModel负责Model与View之间的通信,并完成通信间的额外操作,如数据转换,字符拼接等操作。因此,ViewModel经常作为转换器使用,从而提高代码的复用性。ViewModel还能帮助Controller完成复杂的网络请求逻辑,从而大大降低了Controller的复杂度。这里需要注意的是,ViewModel具有独立性,它并不关心UI的业务逻辑,也不持有任何UI对象,只关心自己的数据处理逻辑是否正确。如果处理不当,ViewModel就会变得跟Controlller一样庞大,又或者是无法体现出ViewModel的独立性,提高代码可复用性。
有很多人认为MVVM设计模式能够减少总体的代码量,这种理解也是不全面的。事实上,MVVM设计模式在实际使用中,虽然能够将诸多非业务逻辑从Controller中抽离,减少了代码的复杂性,但是总体的代码量是不会减少的,甚至会有些许增加。
同时MVVM在有诸多好处的同时也带来了很多新的问题,例如:
1.MVVM将Model通过ViewModel与View绑定使得bug很难被调试。界面的异常又可以是UI绘制的问题,也有可能是Model的问题,这使得一个bug没法被快速定位到。
2.对于过于庞大的项目,数据绑定需要花费更多的内存。从某种意义上来说,数据绑定使得MVVM设计模式变得复杂和难用。
MVC和MVVM模式,并没有谁更优秀,各种模式都有各自适合的应用场景,需要根据具体的使用场景,选择合适的设计模式,即不能守旧 ,也不能盲目使用新技术,这样才能应对技术的变化。
MVVM模式中实现的数据绑定有以下两种较为常用的方式
1.使用KVO的绑定机制,在轻量级的开发中,它能很好的将OC与Cocoa结合起来,不需要借助第三方库进行数据绑定
2.使用ReactiveCocoa 作为绑定机制。ReactiveCocoa是函数响应编程在iOS中的一个实现框架,后面会详细记录用法。