主题:RunLoop:字面意思是一直循环的运行,它就像App中跳动的心脏一样,一直伴随着App的声明周期。
内容:到底什么是RunLoop,简单地说,RunLoop就是一个消息传送机制,用于异步的或线程内部的通信,它提供了一套机制来处理系统的输入源(像sockets,ports,files,keyboard,mouse,定时器等),可以把它想象成是一个邮局,在等待信件和传递信件给收件人,每个NSThread都有属于它自己的RunLoop。
一个RunLoop做两件事情:
1、处于等待的状态直到某件事情发生(比如想接受一个信息)。
2、分配信息给需要接收的对象。
RunLoop可以用来区分交互式App和命令行。
命令行通过一些参数运行后,执行完它们的程序,这个程序就结束了,就像"Hello world",只要打印出"Hello world",这个程序也就结束了。
交互式App就会一直等待用户输入,然后做出反应,然后再等待用户输入,知道某一个触发条件发生,才会退出程序。
从上面可以看出,RunLoop的工作实际上就是在等待触发事件的发生。这些触发事件可以是外部的事件,比如用户的一些行为或者像网络请求,又或者像App内部的信息:比如线程内部的通知、异步代码的执行、定时器等等,一旦一个触发事件发生,并且RunLoop接受到这个信息,它就会去找相关的收信人,并把信息发送给这个收信人。
RunLoop的时间线
1、通知观察者RunLoop已经被启动
2、通知观察者一些定时器已经准备开始
3、通知观察者一些不是基于端口的输入源准备开始
4、启动那些已经准备好的不是基于端口的输入源
5、如果一个基于端口的输入源已经准备好,正等待被启动,那么就会马上启动这个输入源,进入第9步
6、通知观察者这个线程准备休眠
7、把这个线程变成休眠状态直到下面一个事件发生:
a、一个事件到达了一个基于端口的源
b、一个定时器启动
c、RunLoop设置的时间已经到时
d、该RunLoop被唤醒
8、通知观察者该线程被唤醒
9、处理等待事件
a、如果一个用户定义的定时器启动,处理这个定时器并且进入下一个RunLoop,进入第2步
b、如果一个输入源启动,传递这个事件
c、如果这个RunLoop被唤醒,但是还超过设置的超时时间,那么久进入下一个RunLoop,进入第2步。
10、通知观察者RunLoop退出。