Runloop

什么是Runloop

runloop是通过内部维护的事件循环来对事件/消息进行管理的一个对象

  • 没有消息需要处理时候,休眠以避免资源占用 (用户态->内核态)
  • 有消息需要处理时,立刻被唤醒(内核态->用户态)


CFRunloopSource

  • source0(需要手动唤醒线程)
  • source1(具备唤醒线程的能力)

CFRunloopTimer
基于事件的定时器,和NSTimer是toll-free bridged

CFRunloopObserver
观测时间点

  • KCFRunLoopEntry
  • KCFRunLoopBrforeTimers
  • kCFRunLoopBeforsources
  • kCFRunLoopBeforeWaiting(即将产生用户态切换内核态)
  • kCFRunLoopAfterWaiting
  • kCFRunLoopExit

NSRunLoopCommonModes

  • CommmonModes不是实际存在的一种Mode
  • 是同步Source/Timer/Observer到多个Mode中的一种技术方案

RunLoop和NSTimer
void CFRunLoopAddTimer(runloop, timer, commonMode)

RunLoop和多线程

  • 线程和Runloop是一一对应的
  • 手动创建的线程默认没有Runloop

如何实现一个常驻线程
step1: 为当前线程开启一个runloop
step2: 向改runloop添加一个Port/Source等维持Runloop的事件循环
step3: 启动该runloop