关于MVC的资料非常多,可是在繁杂的资料中很难找到几个跟实际相结合又通俗易懂的,比较之下斯坦福iOS公开课保罗(被称为“白胡子老头”)讲的最易于理解又贴近实际开发环境,而斯坦福cs193p这套教程被无数iOS开发者视为必看教材。
下面是这幅图是第二课中讲解的关于MVC的内容:
MVC是什么?
- M:Model 数据模型
- V:View 视图
- C:Controller 控制器
其实MVC是一套代码优化以及合理管理的解决方案。
为什么用MVC?
据说最原始的编程是没有框架的原型,程序员的自由度相当高,每一个程序员都有一套自己的编程和管理代码的标准,不论孰优孰略,你可以想象一下把所有的代码都放到controller中的情形,MVC的出现很大程度上解决了controller中代码的冗余问题,并对代码进行了分类管理。关于MVC历史这里不赘述,详细可Google。
在iOS中是怎么是用MVC的?
下面让我们结合这张图分解下具体内容:
- 1:Model,View和Controller分别用不同颜色的椭圆表示
- 2:Controller和View中间的白色实线和白色虚线表示“Controller直接访问View,View不直接访问Controller”。
- 3:Controller和Model中间的白色实线和白色虚线表示“Controller直接访问Model,Model不直接访问Controller”。
- 4:Mode和View中间的黄色的双实线表示两个禁止访问。
Controller和View的具体的交互方式为:
1>:控制器直接访问view的属性(property),也就是在View中定义的outlet类型的控件,Controller对其直接访问。
2>:点击事件的传递,例如UIButton的target事件,View中的action对应Controller中的target(靶标),在View中的点击事件被传递给Controller中的target。
3>:利用delegate传递信息
最直接的是view的生命周期方法,在这不一一展开。
4>:表格数据源方法data source
Controller和Model的交互方式为:
Model就像一个电台,或者发报机,它是通过广播的形式跟Controller进行交互,具体实现方式是Notification和KVO
总结:
Controller统筹管理View和Model,所有的逻辑都是通过Controller进行管理,而View和Model没有直接的联系,互不访问。为什么M和V互不访问?你可以想象M里面是数组也就是数字,V里面是控件也就是Button等,两者没有什么关系,为了使设计更符合逻辑所以就禁止两者之间互相访问。
PS:
当然MVC也有其弊端,就是Controler的任务繁重,随着工程的日渐扩大,Controller中的业务逻辑也随其变的越来越复杂,这就导致工程不好维护,为了解决这一问题,则出现了MVVM。
MVVM的详解推荐objc中国的《MVVM介绍》这篇文章。