1 / 16
文档名称:

RunLoop的学习总结.doc

格式:doc   大小:149KB   页数:16页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

RunLoop的学习总结.doc

上传人:xxj16588 2017/12/29 文件大小:149 KB

下载得到文件列表

RunLoop的学习总结.doc

相关文档

文档介绍

文档介绍:RunLoop的学****总结
一. RunLoop相关概念
1. 什么是RunLoop
RunLoop与线程相关且是基础框架的一部分。一个RunLoop就代表一个事件处理循环,它可以不停的调度工作以及处理输入事件。使用RunLoop的目的是有效的控制线程的执行和休眠,让线程在有工作的时候忙于工作,而在没工作的时候处于休眠状态。如果不使用RunLoop类似的循环机制,线程执行完当前任务队列中的任务就结束了,程序不能持续运行。也可以把RunLoop理解成一个高级的死循环,这个死循环可以让程序持续运行,且可以时刻监听和处理各种事件。
每一个线程都有唯一对应的RunLoop,主线程的RunLoop是默认开启的;子线程的RunLoop要显示开启且至少添加一个事件源source。我们不需要显示的创建RunLoop,因为RunLoop是懒加载的,在 Cocoa 和 Core Fundation 中都提供了关于RunLoop对象的API来帮助配置和管理线程对应的RunLoop。
2. RunLoop的简单剖析
下图是RunLoop与Source的联系图,图中的左边方框代表一个线程,线程的开始Start到结束End之间有一个RunLoop,当这个RunLoop一直存在的时候,线程就不会销毁。方框中黄色的圈圈代表一个RunLoop,圈圈左边代表当有事件源时,RunLoop就会被唤醒(线程也随之被唤醒),RunLoop会先检测定时事件源,再检测关于performSelector:onThread:的事件源,再检测自定义事件源,最后检测基于端口的事件源。圈圈右边代表当没有事件源时,RunLoop和线程都处于睡眠状态。当然RunLoop也可以通过runUntilDate:方法设定过期时间来退出,当时间到的时候,RunLoop退出,线程也随之销毁。
图中的右边代表事件源的类型,它们分别是:基于端口的事件源、自定义事件源、关于performSelector:onThread:的事件源、定时事件源,前三种又统称为输入事件源。只有当RunLoop存在时,才能保证这些事件源能被处理;如果RunLoop不存在,当前线程运行到End时,线程就会被销毁了,之后如果再有事件源尝试在这个线程中处理事件,系统就会崩溃报错。
RunLoop与Source的联系示意图:
提示:
输入事件源传递异步事件,通常消息来自于其它线程或程序;定时事件源传递同步事件,事件发生在特定时间或者重复的时间间隔。
RunLoop会在处理事件之前发出通知,但要监听这些通知,必须注册一个观察者observer添加到RunLoop中才可监听。
3. RunLoop的运行模式
一个RunLoop要能运行,必须要有一个运行模式。RunLoop的一个运行模式是所有要监听的输入源、定时源、观察者的集合。当要运行一个RunLoop时,必须指定(无论显示还是隐式指定)一个运行模式。在RunLoop的运行过程中,只有和模式相关的输入源和定时源才会被处理,只有和模式相关的观察者才会被激活。和其它运行模式相关的输入源、定时源、观察者,只有在其相关的模式下才能被运行,否则处于暂停状态。通过指定RunLoop的运行模式可以使得RunLoop在某一阶段过滤来源于源的事件。大多数时候,RunLoop都是运行在系统定义的默认模式上。
CFRunLoopModeRef对象代表RunLoop的一个运行模式,一个Runloop对象可以有多个运行模式,但至少有一个运行模式,每个运行模式内又包含若干个Source/Timer/Observer,运行模式内的Source/Timer/Observer可以没有,但是如果没有,RunLoop对象运行时就直接退出了。当要切换运行模式时,必须先停止当前的运行模式,才能启动新的运行模式,这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响。
系统默认注册的5个运行模式:
NSDefaultRunLoopMode:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode的影响
UIInitializationRunLoopMode: 刚启动App时进入的第一个Mode,启动完成后就不再使用,开发中一般不用
GSEventReceiveRunLoopMode: 接受系统事件的内部Mode,通常用不到
提示:
在Core Foundation的底层有一个mutable mon Modes,集合中保存着NSDefaultRunLoopMode和UITrackingRunLoopMode,monModes是用来标