首先解释下MVVM
一种可以很好地解决Massive View Controller问题的办法就是将Controller 中的数据解析部分拿出来,放置到一个专门的地方,而这个地方就是ViewModel 。它促进了UI代码与数据解析分离
在MVVM中,View和View Controller是联系在一起,可以把它们视为一个组件,View和View Controller都不能直接引用Model,而是通过引用视图模型(ViewModel),ViewModel是存放View Controller所需要数据的地方(View Controller敢要,ViewModel就敢给),使用MVVM会轻微的增加代码量,但总体上减少了代码的复杂性、耦合性。
MVVM的优缺点
(1) MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点:
1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
(2) MVVM模式的缺点:
1.数据绑定使得Bug很难被调试。如果界面发生错误,有可能是View的代码有问题,也有可能是Model的代码有问题。数据绑定使得一个位置的Bug被快速传递到别的位置,要想定位原始出问题的地方,就变得不那么容易了。
2.对于大型项目,数据绑定和数据转化需要花费更多的内存(成本)。主要在于:数组内容的转化成本较高:数组里面每项都要转化成Item对象,如果Item对象中还有类似数组,就很头疼。转化之后的数据在大部分情况是不能直接被展示的,为了能够被展示,还需二次转化。只有在API返回的数据高度标准化时,这些对象原型(Item)的可复用程度才高,否则容易出现类型膨大,提高维护成本。
3.调试时通过对象原型查看数据内容,不如直接通过NSDictionary或者NSArray这样直观。
4.同一API的数据被不同View展示时,难以控制数据转化的代码,它们有可能会散落在任何需要的地方。
MVVM模式的其他内容
1.使用MVVM来开发控件。由于控件在大部分情况下不涉及到数据的持久化,所以如果将M纯粹理解为DomainModel的话,使用MVVM模式来进行自定义控件开发,实际上可以省略掉M,变成了VVM。
2.View可以引用ViewModel,但反过来不行(即:不要在ViewModel中引入#import UIKit.h,任何视图本身的引用都不能放在ViewModel中),ViewModel可以引用Model,但反过来不行。
3.MVVM可以兼容当前你使用的MVC架构,也可以增加你开发的应用的可测试性;MVVM配合一个绑定机制效果最好(eg:ReactiveCocoa)。
4.ViewController尽量不要涉及业务逻辑,让ViewModel去做业务逻辑;ViewController 只是一个“中间人”,接收View的事件、调用ViewModel的方法、响应ViewModel的变化;ViewModel 绝不能包含视图View(UIKit.h),否则就跟View产生耦合,不方便复用和测试。
5.ViewModel之间可以有依赖;ViewModel要避免过于臃肿冗余,否则讲重蹈Controller的覆辙,变得难以维护。










网友评论