iOS - Runloop介绍

news/2024/7/20 20:38:14 标签: iOS

文章目录

  • iOS - Runloop介绍
    • 1. 简介
      • 1.1 顾名思义
      • 1.2. 应用范畴
      • 1.3. 如果没有runloop
      • 1.4. 如果有了runloop
    • 2. Runloop对象
    • 3. Runloop与线程
    • 4. 获取Runloop对象
      • 4.1 Foundation
      • 4.2 Core Foundation
      • 4.3 示例
    • 5. Runloop相关的类
      • 5.1 Core Foundation中关于RunLoop的5个类
      • 5.2 CFRunLoopRef
      • 5.3 CFRunLoopModeRef
      • 5.4 相关的类之间的关系
        • 5.4.1 CFRunLoopModeRef
          • 5.4.1.1常见的2种Mode
      • 5.5 Runloop状态
        • 5.5.1 监听Runloop状态

iOS__Runloop_1">iOS - Runloop介绍

1. 简介

1.1 顾名思义

  • 运行循环
  • 在程序运行过程中循环做一些事情

1.2. 应用范畴

  • 定时器(Timer)、PerformSelector
  • GCD Async Main Queue
  • 事件响应、手势识别、界面刷新
  • 网络请求
  • AutoreleasePool

1.3. 如果没有runloop


执行完第13行代码后,会即将退出程序

1.4. 如果有了runloop

  • 程序并不会马上退出,而是保持运行状态
  • RunLoop的基本作用
    1. 保持程序的持续运行
    2. 处理App中的各种事件(比如触摸事件、定时器事件等)
    3. 节省CPU资源,提高程序性能:该做事时做事,该休息时休息

2. Runloop对象

  • iOS中有2套API来访问和使用RunLoop

    1. Foundation:NSRunLoop

    2. Core Foundation:CFRunLoopRef

  • NSRunLoopCFRunLoopRef都代表着RunLoop对象

    1. NSRunLoop是基于CFRunLoopRef的一层OC包装
    2. CFRunLoopRef是开源的

https://opensource.apple.com/tarballs/CF/

3. Runloop与线程

  • 每条线程都有唯一的一个与之对应的RunLoop对象

  • RunLoop保存在一个全局的Dictionary里,线程作为keyRunLoop作为value

  • 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建

  • RunLoop会在线程结束销毁

  • 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

4. 获取Runloop对象

4.1 Foundation

  • [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
  • [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

4.2 Core Foundation

  • CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象`
  • CFRunLoopGetMain(); // 获得主线程的RunLoop对象

4.3 示例

5. Runloop相关的类

5.1 Core Foundation中关于RunLoop的5个类

  1. CFRunLoopRef
  2. CFRunLoopModeRef
  3. CFRunLoopSourceRef
  4. CFRunLoopTimerRef
  5. CFRunLoopObserverRef

5.2 CFRunLoopRef

  • _modes里面装了多个CFRunLoopModeRef对象,其中只有一个mode作为_currentMode

5.3 CFRunLoopModeRef

5.4 相关的类之间的关系

  • CFRunLoopRef里面装了多个CFRunLoopModeRef对象
  • CFRunLoopModeRef对象里面装的是CFRunLoopSourceRefCFRunLoopTimerRefCFRunLoopObserverRef
5.4.1 CFRunLoopModeRef
  • CFRunLoopModeRef代表RunLoop的运行模式

  • 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer

  • RunLoop启动时只能选择其中一个Mode,作为currentMode

  • 如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入

    1. 不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
  • 如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

5.4.1.1常见的2种Mode
  • kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行

  • UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

5.5 Runloop状态

5.5.1 监听Runloop状态
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
    switch (activity) {
        case kCFRunLoopEntry: {
            NSLog(@"kCFRunLoopEntry");
        }
            break;
        case kCFRunLoopBeforeTimers: {
            NSLog(@"kCFRunLoopBeforeTimers");
        }
            break;
        case kCFRunLoopBeforeSources: {
            NSLog(@"kCFRunLoopBeforeSources");
        }
            break;
        case kCFRunLoopBeforeWaiting: {
            NSLog(@"kCFRunLoopBeforeWaiting");
        }
            break;
        case kCFRunLoopAfterWaiting: {
            NSLog(@"kCFRunLoopAfterWaiting");
        }
            break;
        case kCFRunLoopExit: {
            NSLog(@"kCFRunLoopExit");
        }
            break;;
            
        default:
            break;
    }
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopCommonModes);
CFRelease(observer);

触发一次点击事件:

@oubijiexi


http://www.niftyadmin.cn/n/5458519.html

相关文章

WebView的使用与后退键处理-嵌入小程序或者 H5 页面

在使用 WebView 嵌入小程序或者 H5 页面时,通常会涉及到处理后退键的操作。在 Android 平台上,可以通过 WebView 的相关方法来实现后退键的处理。你可以按照以下步骤来实现: 在 Activity 或 Fragment 中找到 WebView 控件,并为其…

服务器被挖矿了怎么办,实战清退

当我们发现服务器资源大量被占用的时候,疑似中招了怎么办 第一时间重启服务是不行的,这些挖矿木马一定是会伴随着你的重启而自动重启,一定时间内重新霸占你的服务器资源 第一步检查高占用进程 top -c ps -ef 要注意这里%CPU,如果…

CIM搭建实现发送消息的效果

目录 背景过程1、下载代码2、进行配置3、直接启动项目4、打开管理界面5、启动web客户端实例项目6、发送消息 项目使用总结 背景 公司项目有许多需要发送即时消息的场景,之前一直采用的是传统的websocket连接,它会存在掉线严重,不可重连&…

【数据结构】新篇章 -- 顺序表

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

git上传和下拉远程仓库

上传仓库 不是git仓库,需要执行 git init命令,初始化为git仓库 git add . 上传所有的文件 git commit -m "本次上传的说明" git remote add origin 远程地址 [是这个地址] git pull --rebase origin master 远程仓库为空,可跳…

Java毕业设计-基于springboot开发的原创歌曲分享平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、平台功能模块2、后台功能模块2.1管理员功能模块2.2用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开…

【Java - 框架 - Lombok】(2) SpringBoot整合Lombok完成日志的创建使用 - 快速上手;

"SpringBoot"整合"Lombok"完成日志的创建使用 - 快速上手; 环境 “Java"版本"1.8.0_202”;“Lombok"版本"1.18.20”;“Spring Boot"版本"2.5.9”;“Windows 11 专业版_22621…

【系统架构师】-第15章-面向服务架构设计

面向服务的体系结构 (Service-Oriented Architecture,SOA) 1、应用角度:它着眼于日常的业务应用,并将它们划分为单独的业务功能和流程,即所谓的服务 2、软件基本原理:一个组件模型,它将应用程序的不同功能单元(称为服…