美文网首页
2. runloop 事件处理

2. runloop 事件处理

作者: 算命的李老师 | 来源:发表于2020-10-21 22:21 被阅读0次

Runloop处理事件模型

RunLoop 的运行逻辑

  • 01、通知Observers:进入Loop
  • 02、通知Observers:即将处理Timers
  • 03、通知Observers:即将处理Source0
  • 04、处理Source0
  • 05、如果存在Source1,就跳转到第9步
  • 06、通知Observers,线程即将休眠
  • 07、通知Observers:开始休眠(等待消息唤醒)(source1,timer,触摸唤醒)
  • 08、通知Observers:结束休眠(被某个消息唤醒)
  • 09、处理消息,跳回02。处理timer,source1
  • 10、通知Observers:退出Loop

具体事件

界面刷新:

  • 当UI改变( Frame变化、 UIView/CALayer 的继承结构变化等)时,或手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法后,这个 UIView/CALayer 就被标记为待处理。
  • 苹果注册了一个用来监听BeforeWaiting和Exit的Observer,在它的回调函数里会遍历所有待处理的 UIView/CAlayer 以执行实际的绘制和调整,并更新 UI 界面。

事件响应:

  • 一个硬件事件(触摸/锁屏/摇晃/加速等)发生后,首先由 IOKit.framework 生成一个 IOHIDEvent 事件并由 SpringBoard 接收, 随后由mach port 转发给需要的App进程。
  • 苹果注册了一个 Source1 (基于 mach port 的) 来接收系统事件,通过回调函数触发Sourece0(所以UIEvent实际上是基于Source0的),调用 _UIApplicationHandleEventQueue() 进行应用内部的分发。
  • UIApplicationHandleEventQueue() 会把 IOHIDEvent 处理并包装成 UIEvent 进行处理或分发,其中包括识别 UIGesture/处理屏幕旋转/发送给 UIWindow 等。

手势识别:

  • 如果上一步的 _UIApplicationHandleEventQueue() 识别到是一个guesture手势,会调用Cancel方法将当前的touchesBegin/Move/End 系列回调打断。随后系统将对应的 UIGestureRecognizer 标记为待处理。
  • 苹果注册了一个 Observer 监测 BeforeWaiting (Loop即将进入休眠) 事件,其回调函数为 _UIGestureRecognizerUpdateObserver(),其内部会获取所有刚被标记为待处理的 GestureRecognizer,并执行GestureRecognizer的回调。

GCD任务:

  • 当调用 dispatch_async(dispatch_get_main_queue(), block) 时,libDispatch 会向主线程的 RunLoop 发送消息,RunLoop会被唤醒,并从消息中取得这个 block,并在回调里执行这个 block。Runloop只处理主线程的block,dispatch 到其他线程仍然是由 libDispatch 处理的。

网络请求:

  • 最底层是CFSocket层,然后是CFNetwork将其封装,然后是NSURLConnection对CFNetwork进行面向对象的封装,NSURLSession 是 iOS7 中新增的接口,也用到NSURLConnection的loader线程。
  • 当开始网络传输时,NSURLConnection 创建了两个新线程:com.apple.NSURLConnectionLoader 和 com.apple.CFSocket.private
  • 其中 CFSocket 线程是处理底层 socket 连接的。NSURLConnectionLoader 这个线程内部会使用 RunLoop 来接收底层 socket 的事件,并通过之前添加的 Source0 通知到上层的 Delegate。

相关文章

  • 2. runloop 事件处理

    Runloop处理事件模型 RunLoop 的运行逻辑 01、通知Observers:进入Loop 02、通知Ob...

  • (iOS干货)关于RunLoop的详细整理

    RunLoop 1.RunLoop的基本作用 1.保持程序的持续运行 2.处理app中的各种事件(比如触摸事件、定...

  • RunLoop

    RunLoop RunLoop就是运行循环,处理app中的各种事件(比如触摸事件,定时器事件,Selector事件...

  • iOS 关于RunLoop

    一 runloop 解释 1. 运行循环(死循环). 2.负责处理监听事件 (如:触摸屏幕,时钟事件,网络事件等)...

  • RunLoop与多线程的原理和使用

    RunLoop1.事件接收和分发机制的实现2.处理App中的各种事件(比如触摸事件、定时器事件、selector事...

  • RunLoop

    什么是RunLoop 简单地说RunLoop的作用是,通过RunLoop对象接收事件,执行处理事件。苹果通过Run...

  • iOS基础-Runloop

    Runloop [TOC] 一、概念 Runloop就是一个事件处理的循环,用来不停的调度工作及处理输入事件Run...

  • 问题:什么是 Runloop?

    RunLoop 即运行循环机制。就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用 RunLoop ...

  • iOS 理解runLoop

    RunLoop的使用及理解 1. RunLoop的基本作用 1.保证程序的持续运行2.处理app中的各种事件(触摸...

  • iOS 这是你想要的

    Runloop 相关 Runloop 保持线程能随时处理事件而不退出深入理解Runloop 线程和Runloop ...

网友评论

      本文标题:2. runloop 事件处理

      本文链接:https://www.haomeiwen.com/subject/iiumpktx.html