iOS应用千万级架构:MVVM框架

业务模块内的MVC和MVVM架构

目前,惟品会中MVC和MVVM架构并存,后期会偏重于MVVM架构的使用。前端

MVC架构

Model:程序中要操纵的实际对象的抽象,为Controller提供通过抽象的业务数据,供Controller调度git

View:视图,负责界面的元素的展现github

Controller:控制器,管理View的声明周期及子view的生成和组装,负责Model和View之间的通讯。网络

MVC框架的优点:
1. 应用普遍,几乎全部前端语言都有相似MVC的设计痕迹
2. 设计思想很是简洁,学习成本很低,新人上手很是容易。架构

MVC框架的问题:
MVC并无对数据请求和处理逻辑代码应该放在哪一层作出明确地划分,所以一旦页面逻辑或交互稍微复杂,Controller就会变得很臃肿,代码也就愈来愈难维护。框架

MVVM架构

MVVM框架是在MVC的基础上演化而来,MVVM想要解决的问题是尽量地减小Controller的任务。布局

Model:程序中要操纵的实际对象的抽象
View(ViewController):MVVM中的View再也不是UIView的子类,而变成了UIViewController的子类。这里的View实际上就是MVC中剥离了处理呈现View逻辑部分的Controller,所以它仍然有各类UIView的属性,仍然有ViewController的声明周期的各类方法,可是这里的Controller再也不负责数据的请求以及处理逻辑,所以再也不臃肿。
ViewModel:MVVM中,ViewModel代替了MVC中的Controller成为了协调者的角色,ViewModel被View(ViewController)持有,同时持有者Model。数据请求以及处理逻辑都放在ViewModel中,View(ViewController)就瘦了下来。学习

MVVM框架的优点:
1. View(ViewController)经过对ViewModel中的数据进行绑定来更新界面,不用经过逻辑或者条件判断来更新view,大大下降了复杂交互时出bug的概率。
2. View(ViewController)中代码简洁,后期的维护和优化比较容易。测试

MVVM框架的问题:
学习成本比MVC高,若是对MVVM的职责划分理解不透彻,很容易致使ViewModel的存在形同虚设, 反而增长了维护的成本。优化

咱们为何要用MVVM?

订单售后这个页面内容很是多,并且里面的内容会变,还能够收缩展开,还会出现由接口请求成功或失败来控制某一部分的显示仍是隐藏。当你使用普通的MVC架构的时候,你会发现,在controller里的代码量很是惊人的,View的计算也很是复杂,当有一块内容要在中间展现的时候,下面的全部的View的Y值都得从新计算。显然,维护成本是很是高的,改动一个小点还可能会致使蝴蝶效应,测试也要回归当前页面全部的用例。

那有没有好的办法来解决这些问题呢?我只想在本身的小块里加功能,当小块的内容高度变化了,整个页面的布局高度跟着本身变化呢。答案是有的,那就是使用MVVM模式。

看下图的UML类图,分析一下,以下:

下面就CollectionView作说明,每个内容都是一个小块Cell,都有本身的cellViewmodel,整个控制器有一个大的viewmodel,包装全部的cellViewmodel,就这样构建一个页面。

一、itemCell 是小块Cell,里面主要是初始化View,更新View的数据,须要返回cell的宽高

二、cellViewModel,是itemCell的ViewModel,给itemCell 提供数据,itemCell的点击事件也是回调到cellViewModel中。

三、Cell1ViewModel 和 item1Cell 组成一个小块Cell1

四、Cell2ViewModel 和 item2Cell 组成另外一个小块Cell2

五、ViewModel 网络请求拿到数据以后,组装上面的小块Cell1ViewModel、小块Cell2ViewModel,经过方法【 - (Class)cellClass 】就能够拿到当前的itemCell

六、ViewModel中,还经过block的方式,对Controller回调绑定了事件,好比cell的点击事件、加载数据成功事件、按钮点击事件等

例子

Demo有两种处理方式,一是经过继承基类,重写基类的方法来实现;二是经过协议,cell使用cellprotocol协议,cellModel使用cellModelProtocol协议。

使用方法

直接继承MVVMBase使用

  1. 新建一个控制器VSDemoCollectionViewController,继承于VSMVVMCollectionViewController
  2. 新建一个该控制器的ViewModel(VSDemoCollectionViewModel),继承于VSMVVMCollectionViewModel,负责管理全部的CellViewModel
  3. 新建一个CellModel(VSDemoCollectionItemCellModel),继承于VSMVVMCollectionViewCellModel,负责管理元素Cell,在方法cellClass中,返回关联的Cell(VSDemoCollectionItemCell)
  4. 新建一个Cell(VSDemoCollectionItemCell),继承于VSMVVMCollectionViewCell,须要重写VSMVVMCollectionViewCell中的方法,返回该cell的高度。
  5. 页面很复杂,须要从新步骤3和4,不断的拆分这个复杂的Cell.
  6. 最后,全部的cellModel都交由第2步的控制器的ViewModel整合加载。

源代码

代码Demo已经上传到github: https://github.com/jiangys/VSMVVM 

相关文章
相关标签/搜索