RunLoop本质
剖析RunLoop本质
说到runloop首先得清楚
- runloop的概念
-
数据结构
使用runloop要达到的一个效果就是有事做的时候做事,没事做的时候休息, -
事件循环机制
使用当中和面试经常会问起 - runloop与NSTimer的的关系或者NSTimer在runloop中使用有什么地方需要注意
- runloop与多线程的关系
- 如何实现一个常驻线程
什么是RunLoop
runloop其实是一个对象,通过内部维护的
事件循环
来对事件\消息进行管理的一个对象
什么是事件循环
没有消息需要处理时,进入休眠,避免资源的占用,从
用户态
-内核态
的状态切换
有消息需要处理时,立刻被唤醒,内核态
-用户态
的状态切换
我们的用户程序一般都运行在用户态上,当发生系统调用,需要一些操作系统、底层的指令,这就出发了内核态
事件循环实现机制
程序的入口
在我们的程序当中,默认的是从main函数入口,而main函数并没有退出?
在main函数中会调用uiapplicationmain函数,而这个函数内部会启动一个runloop,而runloop又是一个事件循环机制,有事做做事,没事做休眠,状态从用户态和内核态来回切换
Runoop数据结构
-
CFRunLoop
-
CFRunLoopMode
sources0
需要手动唤醒线程
sources1
具备自动唤醒线程的能力
我们可以监测哪些时间点- KCFRunLoopEntry
- KCFRunLoopEntryBeforeTimers
- KCFRunLoopBeforeSources
- KCFRunLoopBeforeWaiting
- KCFRunLoopAfterWaiting
-
KCFRunLoopAfterExit
RunLoop有多个mode的原因
通过CommonMode可以把Timer添加到多个mode中,它是一种技术解决方案
CommonMode不是实际存在的一种Mode
- Source/Timer/Observer
OC当中给我们提供了两个RunLoop
- NSRunLoop(Foundation)
- CFRunLoop(core Foundation)
NSRunLoop是对CFRunLoop的封装,提供了面向对象的api
Runoop与线程的关系
怎样实现一个常驻线程
为当前线程开一个RunLoop
向该RunLoop中添加一个port/Source等维持RunLoop的事件循环
启动该RunLoop