百度词条描述的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