MVC
传统的MVC,Cocoa MVC,以及大多数iOS开发使用的MVC,这三者并不相同。
MVC历史悠久,在不同平台有各自的实现方式。其目的是实现并行开发和代码复用。
苹果也设计自己的MVC,其特点是:M和V相互隔离,通过C连接。
但实际的使用并非如此。通常ViewController同时扮演了C和部分V的角色,显得非常庞大。其中包含了各种逻辑,也不利于测试。
M和V经常会直接通信,产生了耦合。例如Cell类经常提供这样的方法计算高度:
+ (CGFloat)cellHeightWithModel:(SomeModel *)model;
MVP
MVP中的V在iOS中指的是ViewController和View。MVP将MVC的ViewController进行拆分:视图数据逻辑处理部分为P,ViewController剩余部分与View合并成V。V和P之间通过Protocol进行通信。
视图数据逻辑:与视图相关的数据处理。例如将
NSDate
转换成NSString
。
MVP实现了各模块的解藕,具有更好的可测试性。但是总体代码量比MVC大。
另外,iOS MVC更适用于快速开发,即代码规模较小的项目。因此将简单的MVC的Demo改成MVP,反而会显得笨拙。
MVVM
在MVP的基础上,将P改成与V双向绑定的VM就变成了MVVM。
绑定是一种响应式的通信方式。当被绑定对象某个值的变化时,绑定对象会自动感知,无需被绑定对象主动通知绑定对象。可以使用KVO和RAC实现。例如在Label中显示倒计时,是V绑定了包含定时器的VM。
双向绑定在MVVM中指的是V和VM之间相互绑定。例如TextField的text长度达到阈值,另一个Button改变背景颜色。这个过程中首先VM感知V中TextField的text属性长度变化,V感知VM中对应的状态属性。一旦V中TextField的text属性长度超出VM中的阈值,VM中的状态属性改变,触发V中Button的背景色发生改变。
选择
- 越复杂的框架耦合度越小,但是开发速度越慢,反之亦然。所以要根据具体项目需求,在不同阶段决定框架。
- 如果模式之间存在兼容性,可选择混合开发。