处理App中各种事件(触摸事件,定时器事件,selector事件)
1Runloop对象
ios中有2套API访问和使用Runloop
Foundation(OC)--->NSRunloop
Core Foundation(C)--->CFRunLoopRef(referenced)
其中NSRunloop是基于CFRunLoopRef的一层包装
2.Runloop与线程
每条线程都有唯一的一个与之对应的Runloop对象
3.获得runloop对象
[NSRunLoop currentRunLoop]获得当前线程runloop,其中在子线程中不会自动创建runloop对象,若有需要可以通过currentRunLoop 创建,且 runloop 对象懒加载,在第一次访问当前线程创建的runloop对象时会创建该对象
在主线程中 currentRunLoop == mainRunLoop
在CFRunLoopRef中 currentRunLoop 实现相当于 参数是当前线程,若runloops为空,则创建一个可变字典,并创建一个mainLoop,并将其添加进该字典key is mainThread,再将当前线程传入函数,并从字典中取出newloop 若newloop为空则创建,最后返回newloop,保证一条线程只有一个runloop,同时,访问其他线程runloop 会优先访问住线程runloop sososo主线程runloop是自动创建的
4.RunLoop相关类
Core Foundation 中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
其中runloop是事件驱动 必须拥有mode 而model 又由source observer 和timer构成
5.CFRunLoopModeRef
其中CFRunLoopModeRef 代表RunLoop的运行模式
一个RunLoop包换若干个Mode ,而没个Mode又包含若干个source<set> timer<array> observer <array>
每次RunLoop启动时,指定一个mode 该mode 为current mode 若需要切换mode 则需要退出当前循环,再重新指定一个mode 进入(是为了分隔不同组的time observer source 的影响)
系统默认注册5个mode ,其中开发者能触碰使用的有2种
kCFRunLoopDefaultMode 默认Mode 主线程通常在该Mode 下进行(定时器默认在defaultMode中进行)
kCFRunLoopCommonModes 占位Mode 并不是一种真正的Mode
UITrackingRunLoopMode 界面跟踪Mode,用于Scrollview追踪触摸滑动页面时 保证不受其他Mode影响(多用于滚动更加的流畅)--------->并未开放
6.CFRunLoopTimerRef
是一个基于时间触发器
同时滚动一个scorllview时 timer不工作,因为在滚动时Run Loop 为UITrackingRunLoopMode
其中被标记为common modes 模式的 mode 通常有两个kCFRunLoopDefaultMode和UITrackingRunLoopMode