RunLoop相关

1. 概念

  • RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象
  • 事件循环
    • 没有消息需要处理时,休眠以避免资源占用


      image
    • 有消息需要处理时,立刻被唤醒


      image
image

2. 数据结构

  • CFRunLoop
    • CoreFoundation 框架
    • 开源
    • CFRunLoop
      • pthread —— 与线程一一对应
      • currentMode —— CFRunLoopMode
      • modes —— NSMutableSet
      • currentModes —— NSMutableSet
      • currentModeItems —— 由多个Source/Timer/Observer组成的集合
    • CFRunLoopMode
      • name
        • NSDefaultRunLoopMode等
      • sources0
        • MutableSet
        • 需要手动唤醒线程
      • sources1
        • MutableSet
        • 具备唤醒线程的能力
      • obverses
        • MutableArray
      • timers
        • MutableArray
    • Source
    • Timer
      • CFRunLoopTimer —— 和NSTimer是toll-free bridged的
    • Observer
      • CFRunLoopObeserver
      • 观测时间点
        • kCFRunLoopEntry
        • kCFRunLoopBeforeTimers
        • kCFRunLoopBeforeSources
        • kCFRunLoopBeforeWaiting —— 即将从用户态切换到内核态
        • kCFRunLoopAfterWaiting —— 从内核态切换到了用户态
        • kCFRunLoopExit
    • 对应关系


      image

      image
  • NSRunLoop
    • Foundation框架
    • 是对CFRunLoop的封装,提供了面向对象的API
    • CommonMode
      • NSRunLoopCommonModes
      • CommonMode不是实际存在的
      • 是同步Source/Timer/Observer到多个Mode中的一种技术方案

3. 事件循环机制

image

image

4. RunLoop与NSTimer

  • 列表滑动时timer的工作


    image

5. RunLoop与多线程

  • 关系
    • 线程和RunLoop是一一对应的
    • 线程默认是没有RunLoop的,第一次获取时创建
  • 实现常驻线程
    1. 为当前线程开启一个RunLoop
    2. 向RunLoop中添加一个Port/Source等维持RunLoop的事件循环
    3. 启动RunLoop

你可能感兴趣的:(RunLoop相关)