runloop内部逻辑?

runloop内部逻辑?
  • 实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。当你调用 CFRunLoopRun() 时,线程就会一直停留在这个循环里;直到超时或被手动停止,该函数才会返回。

  • 内部逻辑:

    1. 通知 Observer 已经进入了 RunLoop

    2. 通知 Observer 即将处理 Timer

    3. 通知 Observer 即将处理非基于端口的输入源(即将处理 Source0)

    4. 处理那些准备好的非基于端口的输入源(处理 Source0)

    5. 如果基于端口的输入源准备就绪并等待处理,请立刻处理该事件。转到第 9 步(处理 Source1)

    6. 通知 Observer 线程即将休眠

    7. 将线程置于休眠状态,直到发生以下事件之一

      • 事件到达基于端口的输入源(port-based input sources)(也就是 Source0)

      • Timer 到时间执行

      • 外部手动唤醒

      • 为 RunLoop 设定的时间超时

    8. 通知 Observer 线程刚被唤醒(还没处理事件)

    9. 处理待处理事件

      • 如果是 Timer 事件,处理 Timer 并重新启动循环,跳到第 2 步

      • 如果输入源被触发,处理该事件(文档上是 deliver the event)

      • 如果 RunLoop 被手动唤醒但尚未超时,重新启动循环,跳到第 2 步

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读

iOS开发——最新 BAT面试题合集(持续更新中)

推荐阅读更多精彩内容