stanford2011学习笔记——MVC模式

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

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

从中我们可以看到,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自己来决定。

转载于:https://my.oschina.net/u/2328888/blog/387525

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值