简介
摘自百度百科对MVC的解释 MVC
MVC (全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
三者的职责
Model(模型)
是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。View(视图)
是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。Controller(控制器)
是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
或许很多小伙伴感觉很疑惑,下面我们就结合例子详细说说MVC
一 初识 MVC
我们先看一副图,很清晰明了的描述了三者之间的关系
三者职责解释说明
Model层
数据处理层,包括网络请求,数据加工View层
所有App上看得到的界面Controller层
Model 与 View层的中介,把Model数据在View上展示出来
对应箭头解释
-
view
将用户交互通知给controller
,通常使用代理。 -
controller
通过更新model
来反应状态的改变。 -
model
(通常使用KVO
)通知controller
来更新他们负责的view
二 变异的MVC
网上还有另外一幅图也很形象的表现iOS实际开发中MVC架构图
这张图是iOS的MVC架构中最经常出现的图,因为IOS中的Controlller 是UIViewController
,所以导致很多人会把视图写在Controller中,这样无疑会导致VC很臃肿。
因此,M-VC
可能是对 iOS 开发中的 MVC模式更为准确的解读,同时更也准确地描述了我们日常开发可能已经编写的 MVC 代码,但它并没有做太多事情来解决 iOS 应用中日益增长的重量级视图控制器的问题。
三 MVC的利与弊
在 iOS 开发中,MVC(Model View Controller)是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式。
Apple甚至是这么说的。在MVC下,所有的对象被归类为一个Model,一个View,和一个Controller。Model持有数据,View显示与用户交互的界面,而ViewController调解Model和View之间的交互。现在,MVC 依然是目前主流客户端编程框架,但同时它也被调侃成Massive View Controller(重量级视图控制器),想必开发者在开发中无可避免被下面几个问题所困扰:
- 厚重的ViewController
- 遗失的网络逻辑(无立足之地)
- 较差的可测试性
接下来就让我们一起探讨MVC的弊端,剖析问题产生原因,打造一个轻量级的ViewController,明确MVC设计模式中各个角色的职责。
3.1 厚重的View Controller
Model:
模型model的对象通常非常的简单。根据Apple的文档,model应包括数据
和操作数据的业务逻辑
。而在实践中,model层往往非常薄,不管怎样,model层的业务逻辑不应被拖入到controller。
View:
视图view通常是UIKit控件,View不应该直接引用model(PS:现实中,使用了),并且仅仅通过IBAction事件引用controller。业务逻辑很明显不归入view,视图本身没有任何业务。
Controller:
Controller是app的胶水代码
:协调模型和视图之间的所有交互。控制器负责管理他们所拥有的视图的视图层次结构,还要响应视图的loading、appearing、disappearing等等,同时往往也会充满我们不愿暴露的model的模型逻辑以及不愿暴露给视图的业务逻辑。
网络数据的请求及后续处理,本地数据库操作,以及一些带有工具性质辅助方法都加大了Massive View Controller
的产生。
3.2 遗失(无处安放)的网络逻辑
苹果使用的MVC的定义是这么说的:所有的对象都可以被归类为一个model
,一个view
,或是一个controller
。
你可能试着把它放在Model
对象里,但是也会很棘手,因为网络调用应该使用异步
,这样如果一个网络请求比持有它的model生命周期更长,事情将变的复杂。显然View里面做网络请求那就更格格不入了,因此只剩下Controller了。若这样,这又加剧了Massive View Controller
的问题。若不这样,何处才是网络逻辑的家呢?
3.3 较差的可测试性
由于View Controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。