1.Runloop简介

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容