美文网首页iOSruntime
Runloop对外的接口

Runloop对外的接口

作者: 二斤寂寞 | 来源:发表于2019-05-15 11:01 被阅读9次

在 CoreFoundation 里面关于 RunLoop 有5个类:

CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef

其中CFRunLoopModeRef类并没有对外暴露,只是通过 CFRunLoopRef 的接口进行了封装。他们的关系如下:

image.png

一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。

CFRunLoopSourceRef

CFRunLoopSourceRef是事件产生的地方。
Source有两个版本:
Source0 只包含了一个回调(函数指针),它并不能主动触发事件。使用时,你需要先调用 CFRunLoopSourceSignal(source),将这个 Source 标记为待处理,然后手动调用 CFRunLoopWakeUp(runloop) 来唤醒 RunLoop,让其处理这个事件。
Source1 包含了一个 mach_port 和一个回调(函数指针),被用于通过内核和其他线程相互发送消息。这种 Source 能主动唤醒 RunLoop 的线程,其原理在下面会讲到。

CFRunLoopTimerRef

CFRunLoopTimerRef 是基于时间的触发器,它和NSTimer是``toll-free bridged的,可以混用。其包含一个时间长度和一个回调`(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。

CFRunLoopObserverRef

CFRunLoopObserverRef是观察者,每个 Observer 都包含了一个回调(函数指针),当 RunLoop 的状态发生变化时,观察者就能通过回调接受到这个变化。可以观测的时间点有以下几个:

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry         = (1UL << 0), // 即将进入Loop
    kCFRunLoopBeforeTimers  = (1UL << 1), // 即将处理 Timer
    kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
    kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
    kCFRunLoopAfterWaiting  = (1UL << 6), // 刚从休眠中唤醒
    kCFRunLoopExit          = (1UL << 7), // 即将退出Loop
};

上面的 Source/Timer/Observer被统称为mode item

  • 一个 item 可以被同时加入多个 mode。
  • 但一个 item 被重复加入同一个 mode 时是不会有效果的。
  • 如果一个 mode 中一个 item 都没有,则 RunLoop 会直接退出,不进入循环。
image.png

相关文章

  • 深入理解Runloop

    RunLoop 的概念 RunLoop 与线程的关系 RunLoop 对外的接口 RunLoop 的 Mode R...

  • dailyLearning -- runLoop

    runLoop runLoop 对外的接口及相关类 runLoop 内部逻辑 runLoop 可以做啥 runLo...

  • 深入理解RunLoop

    转载:ibireme RunLoop 与线程的关系 RunLoop 对外的接口 RunLoop 的 Mode Ru...

  • RunLoop研究

    目录: App启动原理 RunLoop 的概念 RunLoop 与线程的关系 RunLoop 对外的接口 RunL...

  • Runloop对外的接口

    在 CoreFoundation 里面关于 RunLoop 有5个类: 其中CFRunLoopModeRef类并没...

  • 了解runloop(二)

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

  • 深入浅出 RunLoop

    前言 文章主要分为四个部分 一、RunLoop 简介 二、RunLoop 相关接口 三、RunLoop 相关逻辑流...

  • Java学习笔记——接口

    接口概述: 狭义角度,指java中的interface广义角度,对外提供规则的都是接口接口就是提供对外访问的规则 ...

  • 接口工具对比(apipost、jmeter、postman、sw

    一、接口都有哪些类型? 接口一般分为两种:1.程序内部的接口 2.系统对外的接口 系统对外的接口:比如你要从别的网...

  • 接口测试

    首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从...

网友评论

    本文标题:Runloop对外的接口

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