Stanford iOS 8 公开课笔记 <二> -- MVC模式

           

综述:

MVC模式 --即 Model、View、Controller,是20世纪80年代,Xerox PARC 为程序语言 Smalltalk 发明的一种软件设计模式。

Xerox Palo Alto Research Center,简称Xerox PARC,即施乐帕克研究中心,是施乐公司所成立的最重要的研究机构,帕克成立于1970年,位于加利福尼亚州的帕洛阿图市(Palo Alto),坐落在山坡上,而山下就是举世闻名的斯坦福大学。


图片来自公开课Slides


      这种设计模式,如上图,将一个应用程序的所有对象分为三层:Model、View、Controller, 每层之间的通信规则都有严格的规定。这使得每一层用有非常好的独立性,以此大幅度简化开发者后续对程序的修改和扩展工作,也使得对程序中某一部分代码重复利用更为容易,使我们的程序结构更加的直观,让开发者集中精力到解决问题上来,可以说这是一种非常面向对象的设计模式,这也是这种设计模式至今为什么如此被广泛的使用的原因。


详解:


Model (模型):

实现应用程序具体功能的主体,在这里,你可以进行 保存应用程序数据、建立需要的类、实现应用程序的算法、数据管理等操作。例如,写一个计算器应用,那么,具体的计算功能,如 加减乘除 ,就应该在Model中去实现。

View (视图):

应用程序的UI部分,由交互控件组成(实则每一个控件也都是一个View),由它与用户进行交互,获取用户

Controller (控制器):

这是一个媒介,负责监听View中的用户交互事件,简称为事件,(例如点击屏幕、滑动屏幕),Controller 会将事件根据开发者设定的规则处理为数据,然后调用Model中对应的具体的功能模块处理数据,再将处理后的数据根据开发者的设定更新View,这就完成了一个完整的用户交互。

例如,一个点击计算器中 “+” 按键的交互过程: Controller监听到View中用户点击了 “+” 这个Button,就去调用 Model 中对应的加法运算方法,然后更新View -- 将运算结果显示在View当中。

交互规则:


Controller -> View/Model



如上图

Controller 指向 View 的绿色箭头,这说明的是 Controller 可以控制 View,完成UI的更新操作,而 Outlet,是指在 Controller 中声明了一个属性,这个属性指向了 View 中的某一部分。

Controller也可以向Model通信,进行调用Model中的方法等操作...

那么Model可以和View 通信吗? 不可以! 在MVC模式中,要求 Model 与 UI 完全独立,它不能涉及到任何与 UI 相关的东西。



View -> Controller


View如何与Controller通信?MVC 模式 对这种通信有如下规定:View 对 Controller 的通信必须是盲目的 -- 它不能拥有自己要展示的数据,也不能知道事件的用途。

由此,分为事件通信和数据通信两种方式。

图片来自公开课Slides


如上图

事件通信: View 只可以告诉 Controller 一个事件 ,但 View 不可以知道这个事件的用途、作用。这种通信常见的有两种方式:

一、一种用来处理简单事件的方式,就是我们在iOS开发中经常用到的 Action。例如,在 View 中放置一个滑动条 — Slider。 当用户滑动了Slider ,View 只会告诉 Controller 这个 Slider 被滑动了, 但 View 不可以知道这个 Slider 的用途。(例如,是被用来调节音量的还是调节亮度的)

二、一种用来处理复杂事件的方式,就是将Controller 设定为 View 的代理, 即 Delegate。例如我们将常用到的 ScrollViewDelegate,常见的有 did、should、will 方法。View 通过Delegate告诉 Controller ,用户对 ScrollView 的一些操作,例如 将要滑动 ScrollView 、开始滑动 ScrollView、已经滑动了ScrollView, Controller 作为 Delegate 根据这些事件去完成相应的操作,例如在 ScrollView 边界上禁止用户继续滑动。


图片来自公开课Slides

如上图

数据通信:

View不能拥有数据,它只能展示数据,而数据来自哪里?Model!然而 View 禁止和 Model 进行通信,所以就需要 Controller 作为媒介进行数据交互,这种情况,即是一种特殊的代理 -- DataSource。  Controller 作为 DataSource,常见的有 count、data、at等方法,告诉 View 如何显示数据,有多少数据等。

例如利用 TableView 展示1000首歌曲信息,TableView 不能直接拥有1000 首歌曲的信息并加载1000行列表,(这样也极为浪费内存),而应该委托 Controller 作为 DataSource ,由 DataSource 告诉 TableView 屏幕上所能一次显示的歌曲信息、每一行采用怎样的格式显示歌曲信息。当用户滑动列表,则成为一个事件交互,由 TableViewDelegate 判断是否让 DataSource 给 TableView 更多的数据信息。



Model -> Controller


图片来自公开课Slides

最后,当 Model 中的数据改变时,它如何通知给 Controller 呢? 这是一个类似于广播的方式,Model 会将自己的数据改变了这一信息广播出去,Controller 和 View 都可以接受到这一信息,但根据 MVC 模式规则, 只能让 Controller 来对这一信息作出反应。 这种方式被称为  Notification 或者 KVO 。(具体的到我学习了这一部分后会详细讲解)。


以上

                                                                                                                   2016.5.10

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,138评论 25 707
  • 传统模式下的开发MVCMVVM基于面向协议MVP的介绍MVP实战开发说在前面:相信就算你是个iOS新手也应该听说过...
    行走的菜谱阅读 3,160评论 1 5
  • 我们都是父母生而养大的,但是每位父母都不是完人,都有这样或那样的问题。而这些问题,就成了很多人不愿意孝顺父母的理由...
    数字达人阅读 177评论 0 0
  • 文/祎七 01 战狼2火遍大江南北。 这部电影本身宣传的是爱国主义,英雄主义,有极大的感染力和正能量,相信这也是战...
    祎七阅读 813评论 1 7
  • 大概是高二的时候,我得到了人生第二个QQ号,受赠于高中时期就土豪气质逼人的某哥们。面对昵称的空项,我一时也想不出什...
    框框之上阅读 149评论 0 1