美文网首页
1.Runloop简介

1.Runloop简介

作者: 白开了杯水 | 来源:发表于2021-09-27 10:24 被阅读0次
    RunLoop

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

    用伪代码来表示的话,就是一个do while死循环,大概如下

            int retVal = 0;
            do {
                // 睡眠等待消息
                int message = sleep_and_wait();
                // 处理消息
                retVal = process_message(message);
            } while (0 == reValue)
    

    直接窥探RunLoop源码,找到CFRunLoop文件,这里说明一下NSRunLoop和CFRunLoopRef的区分

    • NSRunLoop是oc的封装,CFRunLoopRef是c的封装,它们都可以来访问和使用runloop
    • NSRunLoop是基于CFRunLoopRef的一层OC包装

    继续看源码,我们找到CFRunLoop的定义如下

    CFRunLoop的定义源码

    主要看图中红框的部分,可以得出以下结论

    • 一个RunLoop包含一个线程,一一对应关系
    • 一个RunLoop多种mode(模式),但当前模式只能是其中一中

    模式究竟是什么?可以继续窥探它的源码

    CFRunLoopMode的定义源码

    代码可能有点抽象,把它们画成图大概如下

    RunLoop结构图

    那么它究竟是怎么运作的呢?首先我们要来了解下mode,在RunLoop中有多重mode,开发用到的主要是以下几个

    • kCFRunLoopDefaultMode:默认模式,一般主线程在这个模式下运行
    • UITrackingRunLoopMode : 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
    • kCFRunLoopCommonModes:公用模式,比如你的代码想在UITrackingRunLoopMode和kCFRunLoopDefaultMode模式下都运行,那么就可以选择common mode

    主要还是看红框部分,他们的介绍如下

    • name:模式名称
    • sources0:处理一些普通的代码
      - 触摸事件处理
      - performSelector:withObject:
    • sources1:处理一些普通的代码
      - 基于Port的线程间通信
      - 系统事件捕捉
    • timers:处理定时器
      - NSTimer
      - performSelector:withObject:afterDelay
    • observers:处理通知
      - 用于监听Runloop的状态
      - UI刷新(BeforeWaiting)
      - autoRelease pool

    说到这里,可能会有疑问,这些东西究竟是干什么的,有什么用呢?

    相关文章

      网友评论

          本文标题:1.Runloop简介

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