美文网首页
关于RunLoop

关于RunLoop

作者: ChiralKing | 来源:发表于2019-08-05 11:01 被阅读0次

顾名思义:运行循环,在程序运行中循环做一些事情。
应用范畴:定时器(Timer),performSelectorGCD Async Main Queue,事件响应,手势识别,界面刷新,网络请求,AutoreleasePool
基本作用:保持程序的持续运行,处理App中的各种事件(比如触摸事件,定时器事件等),节省CPU资源,提高程序性能(该做事时做事,该休息时休息)

执行完第13行代码后,程序会退出.png 程序会在需要的时候响应,不需要的时候进行休眠.png

图二相比图一,这都是RunLoop的作用,说明在UIApplicationMain的方法中已经嵌入了RunLoop

RunLoop的伪代码:

RunLoop代码实现.png

iOS中有两套API来访问和使用RunLoop
1.FoundationNSRunLoop
2.Core FoundationCFRunLoopRef
两者都表示RunLoop对象,NSRunLoop是基于CFRunLoopRef的一层OC封装

获取RunLoop对象:
Foundation:[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]
Core Foundation:CFRunLoopGetCurrent(),CFRunLoopGetMain()

RunLoop相关的类(Core Foundation中关于RunLoop的五个类):
CFRunLoopRefCFRunLoopModeRefCFRunLoopSourceRef(事件源),CFRunLoopTimerRef(计时器),CFRunLoopObserverRef

CFRunLoopRef
CFRunLoopModeRef代表运行模式
RunLoop

source0: 指的是非基于端口por,说白了也就是处理触摸事件,selector事件
source1:基于端口的port,是处理系统的一些事件
timers:定时器,NSTimer
observers:监听器,监听RunLoop的运行状态,可以监听的时间有即将进入Loop,即将处理Timer,即将处理Source,即将进入休眠,刚从休眠中唤醒,即将退出Loop

一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/ObserverRunLoop启动时只能选择其中一个Mode,作为currentMode。如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入。不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响。如果Mode里没有任何Source0/Source1/Timer/ObserverRunLoop会立马退出。

目前已知的Mode有五种:
1.kCFRunLoopDefaultMode:App的默认Mode,通常主线程在这个Mode下运行
2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
3.UIInitializationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后不再使用
4.GSEventReceiveRunLoopMode:接收系统事件的内部Mode,通常用不到
5.kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode

RunLoop与线程:
RunLoop和线程:每条线程都有唯一的一个与之对应的RunLoop对象,RunLoop保存在全局的字典中,线程作为key,RunLoop作为value,线程刚创建的时候并没有RunLoop对象,RunLoop会在第一次获取的时候创建,RunLoop会在线程结束时销毁。

RunLoop的运行逻辑:

RunLoop运行逻辑

本文结束。

相关文章

  • RunLoop学习资料

    非常好的runloop学习系列 CoreFoundation源码 RunLoop系列之源码分析 关于Runloop...

  • Runloop的模式及应用

    runloop的5个类 首先,Core Foundation中关于runloop的类: runloop运行时,只能...

  • 记录一些介绍Runloop的牛文

    老司机出品——源码解析之RunLoop详解深入理解RunLoop关于RunLoop部分源码的注释CFRunLoop...

  • RunLoop汇总

    RunLoop 入门 看我就够了RunLoop 已入门?不来应用一下?ibireme的文章,关于RunLoop背后...

  • iOS RunLoop

    关于 runloop 面试中经常被问到: 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? R...

  • 了解runloop(二)

    RunLoop 对外的接口在 CoreFoundation 里面关于 RunLoop 有5个类: CFRunLoo...

  • RunLoop -- CFRunLoopRef

    RunLoop相关的类 Core Foundation中关于RunLoop的几个类 CFRunLoopRef CF...

  • Runloop在实际中到底有什么用?

    在面试中经常会被问到关于Runloop的问题,比如: runloop和线程有什么关系? runloop的mode作...

  • RunLoop学习总结

    通过以下文章学习记录 关于Runloop的原理探究及基本使用 深入理解RunLoop RunLoop完全指南 Ru...

  • RunLoop的各种运行模式

    RunLoop运行模式相关 Core Foundation框架中关于RunLoop的5个类 CFRunLoopRe...

网友评论

      本文标题:关于RunLoop

      本文链接:https://www.haomeiwen.com/subject/hfjolctx.html