首页 > 代码库 > RunLoop

RunLoop

Event驱动  主体就是一个死循环,没事-休眠,有事-唤醒-执行  

runloop:用于解决类似你滑动了屏幕产生了多个事件,为了解耦不影响用户操作,将这些事件加入一个消息队列,这边就不用再去管理这些事件,不会影响操作也不会影响事件的执行,它会从队列中取出一个一个的执行。主线程不需要等待事件处理完成才能进行下一步操作。

1、使程序一直运行并接受用户输入

2、决定程序在何时应该处理哪些Event

3、调用解耦(Message Queue)

4、节省cpu时间,runLoop会造成类似的死循环,使CPU一直在运行,但是它可以休眠在没事的时候不会让cpu运行的机制。

技术分享

NSTimer依赖与runloop实现。

UIEvent从产生到分发都是通过runloop跑的。

Autorelease与runloop有关

CAdisplayLink 是每画一贞60ps或者30ps就回调一次。

CATransition 动画效果,push等改变frame等等的效果

CAAnimation UIView的动画效果

NSURLConnection AFNetworking delegate和网络回来的数据都是通过runloop跑的

断点时 会看到调用堆栈 (如 Thread1)堆栈里面的很多东西都是有runloop搞出来的,看的时候从底下往上看。大部分堆栈都会看到start到runloop 上面的调用可能不一样。

 

主线程或者含有runloop的线程都从一下六个之一的函数调起:

技术分享

source0:处理App内部事件,app自己负责管理(触发),如UIEvent,CFSocket

source1:由runloop和内核管理,Mach port驱动,如CFMachPort(NSPort是对它的封装)、CFMessagePort

runloop构成元素:

技术分享

 

UIkit通过RunLoopObserver在Runloop两次sleep对AutoreleasePool进行pop和push将这次Loop 中产生的Autorelease对象释放。

RunLoop在同一时间只能且必须在一种特定的Mode下Run

更换Mode时,需要停止当前loop,然后重启loop。

Mode是iOS app滑动门顺畅的关键

 

CFRunLoopMode:

NSDefaultRunLoopMode 默认状态,空闲状态,程序起来切换到这个mode,不滑动就一直是这个mode

UITrackingRunLoopMode 滑动scrollView时的Mode

UIInitializationRunLoopMode 私有 app启动时的Mode

NSRunLoopCommonModes(结构类似数组)mode集合

 

RunLoop