这个方式的好處是结构清晰代码量少。弊端是通知有时候速度比较慢反应不够迅速,而且自己不能控制其实监听的本质就是发起一个死循环,不停的测试耳机孔的状态所以可以在自己的程序里面起一个线程,然后生成一个Runloop,不停的去探测耳机孔的状态这种方式在AFNetworking框架里面也使过。为了不停的侦测网络状态AFNetworking就是发起了一个自己的Runloop线程,来监听网络状态
首先定义一个函数,用来判断耳机孔是否插有耳機将来在自定义的线程里面,就是不停的调用这个函数
定义一个静态变量用来保存RunLoop对象。定义为静态变量就不要考虑这个变量的生命周期了。
MVC是IOS里面也是很多程序设计里面的一种设计模式M是model,V是viewC是controller。MVC模式在ios开发里面可谓是用得淋漓尽致
以下是对斯坦福大学ios开发裏面MVC模式的一段话的翻译
主要的宗旨是把所有的对象分为3个阵营,model阵营view阵营,或者是controller阵营
举个例子你要做一个打飞机的游戏,那么这個就是太空中这辆飞船的位置什么机型,每个飞船有多少机枪护甲有多少等等。这就是model所做的事而飞机在屏幕上的位置与model没有关系。
model的作用是怎么把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。事实上还有view和controller之间比较复杂的通信—比如view和controller要保持同步,所以常常view要告诉controller發生了什么这是图上的did,或者将要发生什么这是will,或者要问controller我是否允许什么发生所以这些will,didshould是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的指定的第三方,但不可能是modelcontroller的工作是把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广播非常好用因为是不可见的,但也囿限制只能通知被允许通信的对象发生了什么事,现在我们有了各个阵营间所有的通信机制我们要建立一个复杂应用。复杂应用不仅僅只有一个controllerview可能有100个controller至少有十几个控制很多的view,比如登录界面点击了什么出个表,再点一下出来个其他的什么各种各种的view被controller管理着,那要怎么做复杂应用呢答案是把mvc组合
成mvc群,图上你们可以看到某些controller的view是另一个mvc比如中间这个,它有3个mvc view所以这很普遍,你在一个view里按下了个按钮而另一个mvc显示了数据,这个图有个好的地方是所有的箭头只通过规定的界限。你看其中任何一个部分你明白这部分是幹嘛的,一个model只有一个controller