iOS RunLoop

RunLoop

1、概念

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

2、事件循环:

  • 没有消息需要处理时,休眠以避免资源占用

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

事件循环
RunLoop

3、数据结构

NSRunLoop是不开源的,CFRunLoop是开源的

数据结构
  • CFRunLoop
CFRunLoop
  • CFRunLoopMode
CFRunLoopMode
  • CFRunLoopSource

    • APP运行的过程其实就是处理各种事件的过程,那么,如果让大家把事件进行分类,大家会分成几类?分类的方式有很多,但一定会有下面这几种:
      系统层事件、应用层事件、特殊事件。(这只是为了大家理解source1和source0举得一个不严谨的例子,大家不要在意细节)

    • source0基本就是应用层事件,其中source1基本就是系统事件。复杂点说:

    • Source0 :非基于Port的 处理事件,什么叫非基于Port的呢?就是说你这个消息不是其他进程或者内核直接发送给你的。(performSelector:onThread:)

    • Source1 :基于mach_Port的,来自系统内核或者其他进程或线程的事件,可以主动唤醒休眠中的RunLoop(iOS里进程间通信开发过程中我们一般不主动使用)。mach_port大家就理解成进程间相互发送消息的一种机制就好。(基于Port的线程间通信、系统事件捕捉)

    • 简单举个例子:一个APP在前台静止着,此时,用户用手指点击了一下APP界面,那么过程就是下面这样的:
      我们触摸屏幕,先摸到硬件(屏幕),屏幕表面的事件会先包装成Event, Event先告诉source1(mach_port),source1唤醒RunLoop, 然后将事件Event分发给source0,然后由source0来处理。


      CFRunLoopSource
  • CFRunLoopTimer

CFRunLoopTimer
  • CFRunLoopObserver

    可以观测6个时间点

    • kCFRunLoopEntry 进入RunLoop

    • kCFRunLoopBeforeTimers 即将处理Timers一些事件

    • kCFRunLoopBeforeSources 即将处理Sources一些事件

    • kCFRunLoopBeforeWaiting 即将进入休眠 即将从用户态->内核态切换

    • kCFRunLoopAfterWaiting 内核态->用户态切换后的不久

    • kCFRunLoopExit RunLoop退出

数据关系

4、RunLoop的Mode

  • 如果运行在一个Mode上,只能接受当前Mode的事件,其他Mode不会运行
多Mode
  • CommonMode的特殊性
CommonMode

5、事件循环的实现机制

  • 启动会调用CFRunLoopRun( )方法
实现机制

🌰:main函数调用后会调用UIApplicationMain方法,方法内部会启动主线程的RunLoop,经过一系列处理,主线程的RunLoop处于休眠状态,此时点击一下屏幕会产生一个mach-port,会转换成一个Source1,唤醒主线程,然后运行处理,当程序被杀死就会退出RunLoop,线程被杀死。

6、RunLoop的核心

RunLoop的核心

7、RunLoop与NSTimer

RunLoop与NSTimer
  • void CFRunLoopAddTimer(runLoop, timer, commonMode)
CFRunLoopAddTimer
  • void __CFRunLoopAddItemToCommonModes(const void *value, void *ctx)
CFRunLoopAddItemToCommonModes

8、RunLoop与多线程

RunLoop与多线程
  • 常驻线程

获取当前线程的RunLoop,如果当前线程没有RunLoop会自动创建一个

[NSRunLoop currentRunLoop];
image-20211006121545588
  • 创建一个常驻线程
常驻线程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 对iOS开发者而言,runloop是一个老生常谈的话题,但凡是iOS开发者,在工作中必然直接或间接的接触过r...
    VV木公子阅读 3,004评论 4 21
  • Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,...
    jackyshan阅读 9,888评论 10 75
  • 一、邂逅runLoop 应该是一个美丽的下午,在一场面试上,遇见了runLoop,可惜擦肩而过。。。 二、认识ru...
    AlvinCrash阅读 384评论 0 0
  • runloop概念 Run loops are part of the fundamental infrastru...
    liangxiuchen阅读 187评论 0 0
  • 前言 最近离职了,可以尽情熬夜写点总结,不用担心第二天上班爽并蛋疼着,这篇的主角 RunLoop 一座大山,涵盖的...
    zerocc2014阅读 12,434评论 13 67