stanford2011学习笔记——MVC模式

斯坦福大学的iOS开发系列课程很出名,得到了很多开发者的赞许和支持,也让很多初学者快速领会iOS开发的思路和技巧。其中对iOS开发中广泛使用的MVC模式的讲解部分很详细,这里专门针对这一知识点做个笔记。

MVC在软件开发中时很普遍的一种设计模式,苹果也特别推崇这种设计,target-action和delegate都可以看作是MVC模式中的一个具体实现方式。下面这张图(来自斯坦福大学课件)很好的诠释了iOS中MVC各层之间是如何通信的:
stanford2011学习笔记——MVC模式_第1张图片

从中我们可以看到,Model和View之间是黄线分隔的,表示他们之间不可以直接通信。而Controller有两个绿色箭头分别指向Model和View,表示Controller可以从这两者随意获取信息(虚线),但反过来就不行(白色实线),也就是Controller是拥有绝对的控制权,从Model拿什么数据展示到哪个View都是Controller来决定。Model只负责提供需要的数据,View只负责显示内容,而Controller是连接Model和View的唯一桥梁!

既然View无法直接向Controller获取信息,那如果View接收到手势事件怎么通知Controller呢?这里苹果推出了一种叫委托的实现方式,我们可以看到View指向Controller方向有两条黄色实线分别叫DataSource和Delegate,View可以通过DataSource直接向Controller获取需要显示的内容信息,还可以通过Delegate告诉Controller它发生了什么事情。还有一种方法叫target-action,View层上有个action,表示View发生了事件,而Controller中有个target,表示可以接收这个事件的主体,当View发生action的时候,通过事先定义好的target,通知对应的Controller!

那么Model呢?我们可以看到Model层有个类似于信号天线一样的东西,Controller也有一个,说明他们之间是通过类似于信号广播一样的方式来传输数据。具体的实现有两种,KVO和Notification,他们的原理是一样的,就是当Model发生改变的时候,广播给所有的Controller,如果其中某个Controller刚好能接收这个广播,那它就知道Model发生了变化!

那Model和Controller之间能不能也用Delegate那种方式呢?理论上是可以的!但是为什么苹果不推荐用呢?这就要讨论一下Delegate和Notification之间的区别了:Delegate是一对一的,两者之间必须的建立连接,而Notification不需要,它是一对多的。而我们的Controller跟View几乎都是一一对应的,一个ViewController对应一个View,所以用Delegate比较合适,而我们的Model常常被用在多个场景中,被多个Controller控制,如果用Delegate就必须每个地方都要写才能保证所有的Controller都是接收Model变化的消息。而Notification恰恰解决这个问题,它只负责广播消息出来,至于谁接收谁忽略,让Controller自己来决定。

你可能感兴趣的:(stanford2011学习笔记——MVC模式)