百度词条描述的MVVM:MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑

     

根据自己的理解大致总结了下各模型层的功能:

M 模型层

属性定义,

数据模型层,

配合三方解析数据添加必要方法(jsonModel,MJextenstion,ObjectMapper等)

暴露属性{ set , get}

 

V  :视图层      

子视图搭建,组装

事件外传,

绑定数据源数据模型(VM),用来刷新view

暴露VM,用来刷新自己

 

VM:视图模型层

数据请求,总接口的封装,网络逻辑处理,数据模型的建立

业务逻辑处理,

数据缓存,

视图显示逻辑,

界面值传递



暴露数据源,回调

外部视图需绑定的数据

 

VC: 控制器层

config UI 搭建,管理所有视图

接收 VM 回调 ,

接收 V 的事件,

绑定数据源数据模型(VM),用来整体传递view, reloadView

# 有条件可以创建view管理类,用来统一处理view的回调等view逻辑

总结:

1、MVVM主要目的是为了分离视图(View)和模型(Model)减重controller,

2、view 和 view controller 都不能直接引用model,而是引用视图模型(viewModel)。viewcontroller 中不要引入 model可避免出错

3、viewModel之间可以有依赖,比如一个listController中可以有一个viewModel嵌套一个cellModel。

4、viewModel避免过于臃肿,否则重蹈Controller的覆辙,变得难以维护。做父类集成处理绑定等操作。

5、Model不可做业务数据处理,避免胖Model出现。

6、viewModel 绝对不能包含视图 view(UIKit.h),不然就跟 view 产生了耦合,不方便复用和测试。swift直接注释//import UIKit

7、MVVM 配合一个绑定机制效果最好(PS:ReactiveCocoa  信号传递)。 RAC啊(VM事件信号传递、controller绑定事件)

8、view和controller 正式联系在一起,我们把它们视为一个组件

 MVVM的优势

低耦合:View 可以独立于Model变化和修改,一个 viewModel 可以绑定到不同的 View 上

可重用性:可以把一些视图逻辑放在一个 viewModel里面,让很多 view 重用这段视图逻辑

独立开发:开发人员可以专注于业务逻辑和数据的开发 viewModel,设计人员可以专注于页面设计

可测试:通常界面是比较难于测试的,而 MVVM 模式可以针对 viewModel来进行测试

 

 MVVM的不足

数据绑定使得Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。

对于过大的项目,数据绑定和数据转化需要花费更多的内存(成本)。主要成本在于:

数组内容的转化成本较高:数组里面每项都要转化成Item对象,如果Item对象中还有类似数组,就很头疼。

转化之后的数据在大部分情况是不能直接被展示的,为了能够被展示,还需要第二次转化。

只有在API返回的数据高度标准化时,这些对象原型(Item)的可复用程度才高,否则容易出现类型爆炸,提高维护成本。

调试时通过对象原型查看数据内容不如直接通过NSDictionary/NSArray直观。

同一API的数据被不同View展示时,难以控制数据转化的代码,它们有可能会散落在任何需要的地方

 

参:几个比较好的文章,可以看下

iOS MVVM+RAC 从框架到实战:https://www.jianshu.com/p/3beb21d5def2

iOS 关于MVVM Without ReactiveCocoa设计模式的那些事https://www.jianshu.com/p/db8400e1d40e

总结整理下一个快速开发MVVM框架http://www.cocoachina.com/ios/20160301/15425.html