1.什么是Run loop,Run loop有什么作用?
2.Run loop 是怎么运作的?
3.什么情况下使用Run loop?
1.什么是Run loop,run loop有什么作用?
什么是Run loop:是一个线程入口的循环圈,用事件处理器来响应即将到来的事件。
作用:Run loop 是线程中很基础的一部分。一个Run loop 是用来计划和协调即将到来的事件。Run loop的目的是当有事件处理的时候保证线程运行,在没有事件的时候让线程休眠。
2.Run loop 是怎么运作的?
分四部分:输入源 、观察者、处理方式(mode)、处理事件顺序
输入源:
输入源分:Input sources & Timer sources
Input sources(输入来源):是异步传递事件给你的线程.它包含了基于端口的输入源,自定义输入源。
Timer sources(定时器来源):是同步传递事件给你的线程 (大部分的延迟和定时如:NSTimer的方法,delay方法等)
PerformSelector:OnThread 能在任意指定的线程中执行Selector,但是执行的线程必须激活了Run loop
观察者(Observer):
当需要在线程运行特定的时间进行操作时就可以给线程添加Observer,它几乎可以观察run loop 的处理过程。
可以观察的时机有:当run loop 准备处理timer时;当run loop 准备处理 input source 时;当run loop进入休眠时;当run loop被事件唤醒时;当run loop 退出时。
注:因为观察者监听事件的通知在事件发生之前,所以在事件发生的时候和接受到通知的时间之间有间隔。
处理方式:
Run loop 有多种不同处理的模式,Run loop mode 包含了 input source & timer source & observer 。
每当你运行Run loop时,你必须指定一种运行模式。只有指定模式中包含了的 source 才会被接受,只有包含的observer才会被通知。你可以通过指定mode来过滤掉那些不想接收的消息。
处理事件顺序:
1.通知观察者Run loop已经进入 ->2.通知观察者准备好的定时器即将运行->3.通知观察者非端口的input source即将运行 ->4.运行准备好的非端口的input source ->5.如果基于端口的input source准备好了跳到第九步 ->6.通知观察者线程即将进入休眠->7.当下面任何一件事发生,线程从休眠中被唤醒(从端口传来Input source、定时器启动、run loop设置的运行时间到了、run loop明确的被唤醒)->8.通知观察者线程被唤醒->9.处理等待的事件(1.如果用户定义的定时器启动了,处理定时器时间重新启动loop,跳到Step2。2.如果一个Input source启动了,传递事件。3.如果run loop明确的被唤醒了,但没有超时,重启loop,跳到Step 2) ->10.通知观察者Run loop 退出了。
3.什么情况下使用Run loop?
要保证程序不退出,主线程的Run loop 在main 函数中就已经开启了。但是开启了其它的线程不一定要创建Run loop,除了主线程外,其余线程的Run loop 默认是不开启的。在以下的情况才需要创建Run loop
· 使用Ports或者自定义输入源来与其他线程进行通信
· 在线程中使用定时器
· 使用任何的performSelector方法
· 让线程执行周期性的任务
另外:当不需要Run loop的时候可以自行销毁,不必等待线程结束时退出。
参考文档:
1.https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16
2.http://blog.ibireme.com/2015/05/18/runloop/