RunLoop
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RunLoop相关的知识,希望对你有一定的参考价值。
1、概念:RunLoop实现程序可以循环的接收时事件的不停获取,这是一种典型的事件循环模式(Event Loop)。
例:
2、RunLoop循环模式:
开启循环
睡眠状态,等待唤醒,传入事件
事件传入,唤醒,获取事件
处理事件
下次循环
3、线程和RunLoop紧密相连,不可分割。每个线程最底层有且仅有一个RunLoop与之对应,main线程的RunLoop是开启状态,而子线程的RunLoop默认关闭状态,需要手动打开。Cocoa和CoreFundation提供RunLoop的对象,不需要自己创建。
4、RunLoop的作用:
使程序始终处于运行状态
节省CPU时间
调用解耦和
确定程序再合适时刻调用合适事件
5、RunLoop的使用
(1)、获取RunLoop
NSFundation框架层
+ (NSRunLoop *) currentRunLoop://获取当前线程RunLoop
+ (NSRunLoop *)mainRunLoop://获取main线程RunLoop
CoreFundation层
CFRunLoopGetCurrent();//获取当前线程RunLoop
CFRunLoopGetMain();//获取main线程RunLoop
(2)、RunLoop的启动
- (void) run;//不建议使用(因为无法停止)
- (void) runUntilDate:(NSDate *)limitDate;//设置限制时间
- (void) runMode (NSString *)mode beforeDate(NSDate *)limitDate;//设置模式和限制时间
(3)、设置RunLoop模式
run主要有两种模式,分别是:
NSString * const NSDefaultRunLoopMode;//默认,空闲状态,没有指定模式,则程序运行在这种状态下
NSString * const NSTrackingRunLoopModes;//追踪运动模式,例:动画,拖动等
NSString * const NSRunLoopCommonModes;//模式集合,默认包含上两种模式(重新确定模式的优先级)
私有mode UIInitializationRunLoopMode , GSEventReceiveRunLoopMode
RunLoop在同一时间段内只能有且仅有一种mode(即:currentMode())若想切换模式,只能性质当前RunLoop,切换后,再重新启动RunLoop
(4)、RunLoop的停止
CFRunLoopStop(CFRunLoopGetCurrent());//停止当前RunLoop
[thread cancel];//停止当前线程(不推荐使用,因为当前线程可能被重新唤起,从而导致RunLoop不被停止)
6、RunLoop的相关类
a、CFRunLoopModeRef 是RunLoop的模式,制定事件在运行过程中的优先级
b、CFRunLoopSourceRef 是RunLoop输入源的抽象类(即,不能产生有实际作用的对象的类),source可以分为两类
Source0 和 Source1:
Source0:处理APP本身内的事件
Source1:用于内核和其他线程发送消息,有内核和RunLoop管理,有march port驱动
c、CFRunLoopTimer
RunLoop的时间源。
定时器的三种方法:NSTimer//定时器
CADisPlayLink (每秒钟执行60帧)
· performSelecteor: afterDelay;//延迟执行
d、CFRunLoopObserverRef (RunLoop观察者)
可以观察的时间点有:
7、RunLoop的工作原理
制定march port(唤醒端口)
march_msg监听,该线程挂起停留在march_port_trap状态
其他线程向内和发送该端口的msg,唤醒,RunLoop继续执行
8、事件处理
事件源:Port Source(基于端口输入源)
Custom Source(自定义)
performSelector:方法
Timer Source(定时源)
加入定时源或者输入源,否则不会让线程循环长驻,没有加入则会长期占用CPU,导致不合理分配CPU资源,若在没有while循环,则线程直接完成,被销毁
9、RunLoop的执行顺序
以上是关于RunLoop的主要内容,如果未能解决你的问题,请参考以下文章