runloop定义
- RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。
- 与do-while循环不同的是RunLoop是一种闲等待,即RunLoop具备休眠功能。RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。
runloop作用
- 处理事件
- 触摸事
- 定时器事件
- Selector事件
- 程序持续运行(主线程默认开启了runloop,runLoop保证主线程不会被销毁)
- 节省CPU资源,提高程序性能(没什么事干,可以休眠)
runloop状态
CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
kCFRunLoopEntry = (1UL << 0), // 即将进入RunLoop
kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即将处理Source
kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6),// 刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7),// 即将退出RunLoop
获取runloop
Foundation
[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
Core Foundation
CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象
runloop结构体
一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer,而RunLoop启动时只能选择其中一个Mode作为currentMode。
runloop和线程间的关系
- 每条线程都有唯一的一个与之对应的RunLoop对象
- RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
- RunLoop在第一次获取时创建,在线程结束时销毁
runloop相关的几个类
- CFRunLoopModeRef - RunLoop 运行模式
- kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
- UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动
- CFRunLoopSourceRef - 事件源,输入源
- Source0 表示 非系统事件,即用户自定义的事件
- Source1 表示系统事件,主要负责底层的通讯,具备唤醒能力
- CFRunLoopTimerRef - 常用NSTimer定时器这一类
- CFRunLoopObserverRef - 主要用于监听RunLoop的状态变化