iOS头条干货iOS devRunLoop

iOS开发之RunLoop浅析(一)

2016-05-25  本文已影响325人  小小小阿博er
RunLoop 是 iOS 开发中一个非常基础而又重要的一个概念





RunLoop相关类关系图.png

`

  1. CFRunLoopSourceRef 是事件产生的地方
    Source有两个版本:Source0(非基于端口) 和 Source1(基于端口) ;
    Source0 只包含了一个回调(函数指针),它并不能自己主动触发事件,一般用于需要用户去主动触发的事件。使用时,你需要先调用 CFRunLoopSourceSignal(source),将这个 Source 标记为待处理,然后手动调用 CFRunLoopWakeUp(runloop) 来唤醒 RunLoop,让其处理这个事件;
    Source1 包含了一个 mach_port 和一个回调(函数指针),被用于通过内核和其他线程相互发送消息。这种 Source 能主动唤醒 RunLoop 的线程
  2. CFRunLoopTimerRef 是基于时间的触发器
    它和 NSTimer 是差不多的。其包含一个时间长度和一个回调(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。
    3)CFRunLoopObserverRef 是观察者,每个 Observer 都包含了一个回调(函数指针),当 RunLoop 的状态发生变化时,观察者就能通过回调接受到这个变化。
    可观察状态发生变化的几个时间节点
    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
    kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理 Timer
    kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
    kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
    kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒
    kCFRunLoopExit = (1UL << 7), // 即将退出Loop
    };
    `

Runloop逻辑处理.png 对应逻辑.png

结束语

OK,繁杂的文字说明暂时告一段落,实在没办法,runloop本身就是这样的,需要用文字去说明其本身的含义,写的不足之处欢迎指正,一起学习,这些是目的我对于runloop的基本理解,接下来会继续写关于runloop在iOS开发中的一些实际应用,比如自动释放池,手势识别,常驻线程、PerformSelecter等

上一篇 下一篇

猜你喜欢

热点阅读