标签:
MVC是IOS里面也是很多程序设计里面的一种设计模式,M是model,V是view,C是controller。MVC模式在ios开发里面可谓是用得淋漓尽致。
以下是对斯坦福大学ios开发里面MVC模式的一段话的翻译
主要的宗旨是把所有的对象分为3个阵营,model阵营,view阵营,或者是controller阵营
model(APP的目的)
举个例子,你要做一个打飞机的游戏,那么这个就是太空中这辆飞船的位置,什么机型,每个飞船有多少机枪,护甲有多少等等。这就是model所做的事,而飞机在屏幕上的位置与model没有关系。
model的作用是怎么把model展现在用户面前,它获取了飞船在太空中的位置,然后算出怎么在屏幕上展现出来。
这就是controller,controller控制如何在UI上展现model
view就是controller在仆人,view就是controller所使用的工具。我们尽可能地使view阵营里面的对象通用化。
就像按钮、滑动条等,这些都是苹果自带的。controller利用这些通用的view来做model所需要做的事,view应该是很通用的。因为系统上有好多view,还有和应用相关的功能来控制view。我们要更先进一点,利用通用的view来理解和使用这些功能。
controller向model发消息是100%被允许的,这个箭头是绿色箭头,controller可以问model任何问题,controller知道model的任何事情,因为controller就是用来把model展现在屏幕上,所有它要有完全的访问权,这个箭头是单向的,所以只有controller知道model,这里面的像一个交通标志,从controller到model是白色虚线,所以可以随时跨过去,等一会,我们会看到这个虚线不是一直是虚的。那么controller和view的通信会是怎么样?也是绿色箭头,controller是要吧model显示在屏幕上,所以它可以对view做任何事。例如设个标志,让view做些事情,在屏幕上排列view,数据通信,所以这条路也是白色的虚线,你们看见那个词outlet
outlet是一个表达式用来表示controller的用来和view通信的一个属性,所以我们要在controller里创建outlets到view中去,那model和view怎么样?这门课的宗旨,它们永远不会互相通信。我相信你们都理解为什么model不和view通信,因为model和用户交互界面无关,你可以有一个飞船射击游戏的model,然后通过view来控制,移动飞船到XYZ,射击,你可以这么做,虽然比较笨但你可以这么做。
所以model是完全ui独立的,你们都应该明白model不应该和view通信,有些人说,我有一些自定义的view,掌控者model,所以能够显示model。这听起来挺吸引人的,但这不是一个好主意的原因-重用。因为你吧view和model连在了一起,model变了以后view也要重写,view不能被重复利用,model也不能被 其他ui用
比如iPad出来了,因为屏幕大小的原因需要一个新的ui,你就得重写整个view,最好是把这部分放到controller里,建一些更通用的view对象;另一个原因是,如果view和model通信,那么现在所有人都能和model通信了,view和model通信 ,controller和model通信,model就有点hold不住了,如果只有controller和model通信就能很容易搞清楚程序在干嘛,所以把view排除在外,view只是controller的仆人,让controller来通信。所以,在这门课上永远不会发生view和model相互通信的情况,双实线如果你越线我就给你开罚单。view能否允许和controller通信?答案是在某种程度上是可以的,所以这条线是黄色的。view(通用的)和controller(详细控制如何在屏幕展现model)之间的通信是不可见的,view不知道之间在和谁说话,但有一个好的架构。所以在xcode我们可以很好的有组织的连接view和它的controller。所以,view向controller通信的方法,有结构的方法,一个被称为target action。target action很简单,就是controller自己画了一个target,然后把一个action交个它的view。当view发生了一些事,比如按钮被按滑动条被滑动,它会把action发到target,然后controller就知道按钮被按了。这就是view向controller通信的机制,view回报controller发生了什么。但是view对controller知道的并不多,只是简单的发送target action。事实上,还有view和controller之间比较复杂的通信—比如view和controller要保持同步,所以常常view要告诉controller发生了什么,这是图上的did,或者将要发生什么,这是will,或者要问controller我是否允许什么发生,所以这些will,did,should是view要问的问题。这么做的原因是因为controller把自己设成委托,用协议,希望你们都知道什么是协议,我们会在obj-c里会讲到,设定一个协议,来回应will did should在一次,view不用知道回应的controller是哪个类 delegation是另一个view和controller通信的方法,另一个很重要的事是,view不是它显示的数据的所有者,这很重要:所以用红色来显示,你们要了解view没有数据,view只是一个平面,用来显示数据,一个显示信息的平台,view没有 实体变量也不会去存储,只有指向他们的指针,所以你iPod库里面 的1000首歌不会是view的实体变量,这种设计使得,比如view不会去管理数据库,跟新iPod歌曲库,这不是view干的活,而是controller或者model干的,如果view不拥有它所显示 的数据,它如何获得数据呢?一个类似delegation的方法,它又一些协议,比如这里的data at和count,这对一个表挺有用的,表可以问表里有多少东西 ,比如5000,那好我要地100到150条的数据,我要用来显示 ,所以view去根据需求来请求数据,这会非常高效的,如果另外一头知道怎么管理一个巨大的数据库,而只是提取其中需要的几条,因为ipod里有10000首歌,但屏幕上只显示7首。你要这种功能,但不要把它写在一个view里,view是通用的用来显示的,controller金额model一起来有效率的提供信息,类似地,view会有一个数据源的设置,controller会回应数据源,注意,数据源的delegation永远是controller,或者是controller的指定的第三方,但不可能是model,controller的工作是把model的信息传递给view,响应所有的delegation。因为它能获取model里的数据,决定怎么在屏幕上显示,这是它的职能,所以它要参与这个循环,你们可能需要这些data at和count的方法,可能只是一行代码,问model数据是什么,然后model把数据给你,即使这是一行代码,也需要controller来参与,因为这是controller的工作,获取model显示在屏幕上,我反复讲了5编,这是controller的工作,在iOS开发这很重要,你要给他机会做他的工作,永远不要越过view和model中间的线,还有一件事,model能向controller发话吗这个很明显,肯定不行的。model是ui独立的,不能向controller发话,这是controller的工作来用view显示model,那么当model的一些东西改变了,你要更新controller的时候该怎么办呢?你有个数据库,某人在数据库里写了些东西,比如你的飞船游戏里的其他玩家攻击了你 的飞船,现在model改变了是因为飞船受伤了 。
在iOS里面我们实现的方法是用一个广播站就像信息广播机制,有2个机制,通知关键数据监听,当model改变了,它就在广播站里广播,controller收听到了,然后去model什么东西改了。这是完全不可见的,同步的,这里的kvo也可以用于view和controller但不会是view和model,view不会有面向model的广播,view和controller会互相有广播。model广播非常好用,因为是不可见的,但也有限制,只能通知被允许通信的对象发生了什么事,现在我们有了各个阵营间所有的通信机制,我们要建立一个复杂应用。复杂应用不仅仅只有一个controller。view可能有100个controller至少有十几个控制很多的view,比如登录界面,点击了什么出个表,再点一下出来个其他的什么,各种各种的view被controller管理着,那要怎么做复杂应用呢?答案是把mvc组合 成mvc群,图上你们可以看到某些controller的view是另一个mvc,比如中间这个,它有3个mvc view,所以这很普遍,你在一个view里按下了个按钮,而另一个mvc显示了数据,这个图有个好的地方是,所有的箭头只通过规定的界限。你看其中任何一个部分,你明白这部分是干嘛的,一个model只有一个controller
标签:
原文地址:http://blog.csdn.net/qq_25491201/article/details/51254953