iOS开发--MVC设计模式

前言

最近一段时间在看斯坦福大学的iOS9视频课程,斯坦福老头在讲解MVC时我收获良多。参考Swift编程(四):深入浅出MVC模式一文,在观看完Applyiing MVC一节视频后,我也试着总结一下该节视频的关键知识点。

MVC设计模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。(来自百度百科)

MVC简介

从本质上来说,MVC模型将应用或代码分割成三个不同的“阵营”:

模型(Model)

The Model camp is what your application does.
Nothing about how it‘s drawn on screen or how it's displayed.

解释:模型是你的应用是什么,是程序的行为的合集。

视图(View)

The View, you can think of as your controller's minions.The things that the controller's gonna user to put things on sceen.

解释:视图是控制器的仆从,那些controller想要在屏幕上展示的界面控件,如UIButton、UILabel、UITableView等,用于展示Model的信息。

控制器(Controller)

The controller is how your model is displayed on screen.It's kind of the how.This is basically all your UI logic, goes into your controller.

解释:控制器是控制你的模型如何在界面上展示的工具。关键在于如何进行展示,控制器主要包含了你的界面逻辑以及界面的跳转。

MVC三个“阵营”运转的机制

三个“阵营”交互的关键在于,哪些行为是允许的,哪些行为是不允许的,以及什么时候进行交互,如何在iOS中实现,如何促进各“阵营”的交流。

MVC

解释:
如图,斯坦福老头在中心绘制了一个’Y‘字的图案,在’Y‘的下方有两条黄色的线条,表示两边是不相通的,上方两条白色的线表示两边是可以相通的。
注意:三个“阵营”交互的方向总是固定的。

控制器(Controller)& 模型(Model)的通信

控制器(Controller)-> 模型(Model)

Controller知道Model所有的属性和方法,可以调用Model所有的方法。Controller能完全控制Model,这是因为controller的任务就是展示给用户看Model的信息,或者从用户处获得信息以及更新Model的信息。
见上图,绿色箭头和白色虚线表示Controller可以完全控制Model。

模型(Model)-> 控制器(Controller)

一般情况下,Model是不能与Controller通信的。为了实现Model如何通知Controller它的数据发生变化,iOS采用Notification(广播)KVO(键值对观察)的形式。广播的机制是:Model将自己设立为广播中心,通过发送广播,通知那些对数据变化有监听的广播站,然后将Controller设置成接收广播的设备。由此可看出,Model并不会直接对Controller进行通知,它只是通知那些想知道的对象。

控制器(Controller)& 视图(View)的通信

控制器(Controller)-> 视图(View)

Controller希望展示Model的信息,需要使用到它的“仆从”(View)。大部分情况下,从Controller到View的交互方式都是通过Outlet来实现的。
见上图,带有Outlet字眼的绿色箭头和白色虚线表示Controller可以完全控制View。

视图(View)-> 控制器(Controller)

从View到Controller的通信的问题在于,所有的控件都是一个通用的类型,例如UIButton或UILabel,对于这些控件来说,它们不能真正地了解调用它们的Controller,故它们只能以盲目的方式与Controller通信。因此Controller与View之间的通信是有限制的。

  • Target-Action模式
    只需通过Ctrl + 左键拖拉控件到Controller,此时Controller被设定成target,在Controller会生成一个返回类型为IBAction的方法。当View向Controller通知有事件在它身上触发时,view根本不需要知道它通知的Controller是什么样的,只需简单地调用该方法即可,
    见上图,带有action字眼的短小的黄色双箭头,一端黏在View上,一端大概地指向Controller。

  • delegate(委托)和 dataSource(数据源)协议
    delegate(委托)
    有些时候,发生在View上的事件比较复杂,通过Target-Action模式无法通知给Controller足够的信息。如tableView的滚动、某一行被点击等,这时候view可以将Controller设置为它的delegate,委托Controller来处理这些复杂的事件。通常这些委托方法的名字会带有will、should、did等关键字。
    dataSource(数据源)协议
    疑问:我们知道,任何View都不能包含它们所展示的Model,那么在没有Model的情况下,View是如何进行展示的?
    解释:除了上面的delegate(委托)协议,还有另外一种协议——dataSource(数据源)协议。dataSource协议的方法不带will、should、did等关键字。借助这些dataSource协议方法,View通过询问Controller,而Controller从Model中获得数据,从而View可以获得需要显示的数据,以及根据数据来决定如何显示。

模型(Model)& 视图(View)的通信

Model和View是相互独立的,所以它们之间完全不可能产生直接交互。对于那些完全和界面独立的Model来说,View只是Controller的仆从,Model和View之间的交互是完全没有意义的,因此在实际设计中也不允许这样做。

参考链接

Swift编程(四):深入浅出MVC模式

被误解的 MVC 和被神化的 MVVM

Developing-iOS-9-Apps-with-Swift-lecture2.Applying MVC

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容