首页 > 代码库 > 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