RunLoop

本文详细介绍了RunLoop的概念,它是如何通过事件循环管理事件的,以及其内部的数据结构。重点讨论了RunLoop的Mode、与NSTimer的关系以及在多线程中的应用。文中还提到了RunLoop在实际应用中的启动机制,例如在main函数中启动主线程的RunLoop,并在接收到事件时唤醒处理。此外,还阐述了如何创建常驻线程并管理其RunLoop。
摘要由CSDN通过智能技术生成

RunLoop

1、概念

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

2、事件循环:

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

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

事件循环
RunLoop

3、数据结构

NSRunLoop是不开源的,CDRunLoop是开源的

数据结构
  • CFRunLoop
CFRunLoop
  • CFRunLoopMode
CFRunLoopMode
  • CFRunLoopSource
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、事件循环的实现机制

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

🌰: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
  • 创建一个常驻线程
常驻线程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值