iOS - Runloop介绍

文章目录

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

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

相关推荐
DisonTangor6 小时前
苹果发布iOS 18.2首个公测版:Siri接入ChatGPT、iPhone 16拍照按钮有用了
ios·chatgpt·iphone
- 羊羊不超越 -6 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
2401_865854881 天前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
HackerTom1 天前
iOS用rime且导入自制输入方案
ios·iphone·rime
良技漫谈1 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
2401_852403551 天前
高效管理iPhone存储:苹果手机怎么删除相似照片
ios·智能手机·iphone
星际码仔2 天前
【动画图解】是怎样的方法,能被称作是 Flutter Widget 系统的核心?
android·flutter·ios
emperinter2 天前
WordCloudStudio:AI生成模版为您的文字云创意赋能 !
图像处理·人工智能·macos·ios·信息可视化·iphone
关键帧Keyframe2 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端
pb82 天前
引入最新fluwx2.5.4的时候报错
flutter·ios