美文网首页
关于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

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