什么是MVVM
为什么使用MVVM
iOS中,我们使用的大部分都是MVC架构。虽然MVC的层次明确,但是由于功能日益的增加、代码的维护,使得更多的代码被写在了Controller中,这样Controller就显得非常臃肿。为了给Controller瘦身,后来又从MVC衍生出了一种新的架构模式MVVM架构。
MVVM分别指什么
MVVM就是在MVC的基础上分离出业务处理的逻辑到ViewModel层,即:
M----->Model层:请求的原始数据
V----->View层:视图展示,由ViewController来控制
VM---->ViewModel层:负责业务处理和数据转化
简单来说,就是API请求完数据,解析成Model,之后在ViewModel中转化成能够直接被视图层使用的数据,交付给前端(View层)。
MVVM与MVC的不同
首先我们简化一下MVC的架构模式图:
在这里,Controller需要做太多得事情,表示逻辑、业务逻辑,所以代码量非常的大。而MVVM:
在MVVM中,我们趋向于将view和view controller作为一个整体(这也解释了为什么不称它为MVVCVM),新的viewModel代替原来的viewController协调view与model之间的交互。
对这种MVVM架构中的"更新"机制,我们没有什么概念。实际上也没有什么关于MVVM的东西迫使你使用特定的机制来更新视图模型或视图。但在本书的范围内,我们将使用ReactiveCocoa来做处理这个。
ReactiveCocoa将会监控数据模型(model)的变化,并将这个变化映射到视图模型(viewModel)的属性上,执行任意必要的业务逻辑。
举一个具体的例子:
假设我们的模型包含一个“日期”(用dateAdded表示),我们想要监控这个“日期”的变化,来更新我们视图模型(viewModel)的属性dateAdded.模型(model)的属性是一个NSDate的实例,但视图模型(viewModel)中对应的属性是从它转换过来的NSString。这种绑定看起来跟下面的代码类似(在viewModel的初始化方法中进行):
RAC(self, dateAdded) = [RACObserve(self.model,dateAdded) map:^(NSDate *date) {
return [[ViewModel dateFormatter] stringFromDate:date];
}];
dateFormatter是ViewModel的一个类方法,它缓存了一个NSDateFormatter实例以便复用(创建NSDateFormatter代价昂贵)。 接下来,view controller 可以监控viewModel的dateAdded属性将它跟一个label进行绑定。
RAC(self.label, text) = RACObserve(self.viewModel, dateAdded);
现在,我们已经将日期转换为字符串到视图模型的过程抽象出来了,在(viewModel)中我们可以为这个业务逻辑编写单元测试。这个例子看起来简单,但就像我们看到的,它显著地减少了你的视图控制器中的业务逻辑。
更多建议: