MVC是一个作iOS开发都知道的设计模式,也是Apple官方推荐的设计模式。实际上,Cocoa Touch就是按照MVC来设计的。
这里,咱们先不讲MVC是什么,咱们先来谈谈软件设计的一些原则或者说理念。在开发App的时候,咱们的基本目标有如下几点:
可靠性 - App的功能可以正常使用
健壮性 - 在用户非正常使用的时候,app也可以正常反应,不要崩溃
效率性 - 启动时间,耗电,流量,界面反应速度在用户容忍的范围之内
上文三点是表象层的东西,是大多数开发者或者团队会着重注意的。除了这三点,还有一些目标是工程方面的也是开发者要注意的:
可修改性/可扩展性 - 软件须要迭代,功能不断完善
容易理解 - 代码可以容易理解
可测试性 - 代码可以方便的编写单元测试和集成测试
可复用性 - 不用一次又一次造轮子
因而,软件设计领域有了几大通用设计原则来帮助咱们实现这些目标:
单一功能原则,最少知识原则,聚合复用原则,接口隔离原则,依赖倒置原则,里氏代换原则,开-闭原则
这里的每个原则均可以写单独的一篇文章,本文篇幅有限,很少讲解。
基于这些设计目标和理念,软件设计领域又有了设计模式。MVC/MVVM都是就是设计模式的一种。
MVC
历史
二十世纪世纪八十年代,Trygve Reenskaug在访问Palo Alto(施乐帕克)实验室的时候,第一次提出了MVC,而且在Smalltalk-76进行了实践,大名鼎鼎的施乐帕克实验室有不少划时代的研发成果:我的电脑,以太网,图形用户界面等。
在接下来的一段时间内,MVC不断的进化,基于MVC又提出了诸如MVP(model–view–presenter),MVVM(model–view–viewmodel)等设计模式。
组件
MVC设计模式按照职责将应用中的对象分红了三部分:Model,View,Controller。MVC除了将应用划分红了三个模块,还定义了模块之间的通讯方式。
Model
Model定义了你的应用是什么(What)。Model一般是纯粹的NSObject子类(Swift中能够是Struct/Class),仅仅用来表示数据模型。
Controller
Controller定义了Model如何显示给用户(How),而且View接收到的事件反馈到最后Model的变化。Controller层做为MVC的枢纽,每每要承担许多Model与View同步的工做。
View
View是Model的最终呈现,也就是用户看到的界面。
优势
MVC设计模式是是一个成熟的设计模式,也是Apple推荐的的设计模式,即便是刚入行的ios开发者也多少了解这个设计模式,因此对于新人来讲上手迅速,而且有大量的文档和范例来供咱们参考。
在MVC模式中,View层是比较容易复用的,对应Cocoa中的UIView及其子类。因此,github的iOS开源项目中,View层也是最多的。
Model层涉及到了应用是什么,这一层很是独立,可是每每和具体业务相关,因此很难跨App服用。
既然只有Model-View-Controller三个组件,那么剩余的逻辑层代码就比较清楚了,所有堆积到Controller。
通讯
MVC不只定义了三类组件,还定义了组件之间通讯的方式。
MVC三个组件之间的通讯方式如图
Controller做为枢纽,它指向view和Model的线都是绿色的,意味着Controller能够直接访问(以引用的方式持有)Model和View。
View指向Controller的是虚线,虚线表示View到Controller的通讯是盲通讯的,缘由也很简单:View是纯粹的展现部分,它不该该知道Controller是什么,它的工做就是拿到数据渲染出来。
那么,何为盲通讯呢?简单来讲当消息的发送者不知道接受者详细信息的时候,这样的通讯就是盲通讯。Cocoa Touch为咱们提供了诸如delegate(dataSource),block,target/action这些盲通讯方式。
Model指向Controller的一样也是虚线。缘由也差很少,Model层表明的数据层应该与Controller无关。当Model改变的时候,经过KVO或者Notification的方式来通知Controller应当更新View。
这里有一点要提一下:UIViewController每每用来做为MVC中的Controller,MVC中的Controller也能够由其余类来实现。
问题
经过上文的讲解,咱们能够看到在纯粹的MVC设计模式中,Controller不得不承担大量的工做:
网络API请求
数据读写
日志统计
数据的处理(JSON<=>Object,数据计算)
对View进行布局,动画
处理Controller之间的跳转(push/modal/custom)
处理View层传来的事件,返回到Model层
监听Model层,反馈给View层
因而,大量的代码堆积在Controller层中,MVC最后成了Massive View Controller(重量级视图控制器)。
为了解决这种问题,咱们一般会为www.jiyuannnn.cn/ Controller瘦身,也就是把C www.yongshiiyule.cn /ontroller中代码抽出到不一样的类中,引入MVVM就是为Controller瘦身的一个很好的实践。
MVVM
在MVVM设计模式中,组件变成了Model-View-www.huazongyule.com/ ViewModel。
MVVM有两个规则
View持有ViewModel的引用,反之没有
ViewModel持有Model的引用,反之没有
图中,咱们仍然以实线表示持有,虚线表示盲通讯。
在iOS开发中,UIViewController是一个至关重要的角色,它是一个个界面的容器,负责接收各种系统的事件,可以实现界面专场的各类效果,配合NavigationController等可以轻易的实现各种界面切换。
在实践中,咱们发现UIViewController和View每每是绑定在一块儿的,好比UIViewController的一个属性就是view。在MVVM中,Controller能够看成一个重量级的View(负责界面切换和处理各种系统事件)。ios