RunLoop 的事件来源主要包括以下几种:
- 输入源(Input Sources):包括用户交互事件(如触摸、键盘输入)、系统事件(如传感器数据、设备连接断开)、自定义事件等。
- 定时源(Timer Sources):用于触发定时事件,可以是一次性定时器或重复定时器。
- 自定义事件(Custom Sources):通过自定义的方式向 RunLoop 中添加的事件源。
这些事件源都会被添加到特定的运行模式(Run Mode)中,并根据优先级进行处理。RunLoop 可以同时处理多个运行模式,每个运行模式都有自己的事件源集合。
事件的处理优先级如下:
- 高优先级事件:包括系统事件(如触摸事件、网络数据到达等)和用户交互事件(如滑动、点击等),它们会被立即处理,并且可能会中断当前的代码执行。
- 默认优先级事件:包括定时器事件、自定义事件等,按照预定的时间触发或被唤醒,会在适当的时机被处理。
- 低优先级事件:指那些在非常空闲时才会被处理的事件,如空闲定时器。
当某个运行模式中的事件源被触发时,RunLoop 会依次处理该模式下的所有事件,直到所有事件都被处理完毕或者遇到阻塞的情况(例如 UI 更新、耗时计算等),RunLoop 才会退出该模式并切换到其他模式处理事件。
需要注意的是,RunLoop 并不是完全按照优先级顺序处理事件,而是按照特定的算法和策略进行调度和分配,保证高优先级事件得到及时处理,同时兼顾低优先级事件的执行。这样可以确保应用的响应性和流畅性,避免阻塞主线程。
网友评论