Runloop详解

Runloop是一个对象,通过内部维护的事件循环 去管理 事件和消息;

Runloop是一些RunloopMode的集合;

常用的几种运行模式:

kCFRunLoopDefaultMode(默认模式,主线程是在这个运行模式下运行,所以UI刷新时在该线程);

UITrackingRunLoopMode(用户交互模式,比如拖拽,滑动等)

kCFRunLoopCommonModes(伪模式,其实是同步的在多个Mode中切换)

没有消息时休眠,从用户态切换到内核态;

有消息处理时,从内核态切换到用户态;

NSRunloop是对CFRunloop进行封装,包含五个类:

1.CFRunloop:Runloop对象;

由pthread(线程对象),currentMode(当前运行模式),modes(多个运行模式集合),commonModes(模式名称字符串集合),commonModel(Observer,timer,source集合)组成;

2.CFRunloopMode:运行模式;

由name,source0,source1,observers,timers集合构成;

3.CFRunloopSource:输入源/事件源;

分为source0(用户触发的事件,需要手动唤醒线程)和source1(基于port,包含mach_port和一个回调,监听系统端口和内核及其他线程发送的消息,可以主动唤醒线程)两种

4.CFRunloopTimer:定时源;

也就是NSTimer,在设定的时间点唤醒Runloop执行回调,但不一定是实时的(因为当线程处理事务繁忙时,会导致本次timer延迟甚至少执行一次);

5.CFRunloopObserver:观察者;

监听时间点,比如kCFRunLoopEntry(准备启动状态);kCFRunLoopBeforeTimers(将要处理timer事件);kCFRunLoopBeforeSources(将要处理source事件);kCFRunLoopBeforeWaiting(将要休眠,从用户态切换到内核态);kCFRunLoopAfterWaiting(被唤醒,从内核态切换到用户态);kCFRunLoopExit(runloop将要退出);kCFRunLoopAllActivities(监听所有状态)

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

推荐阅读更多精彩内容

  • Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,...
    jackyshan阅读 9,915评论 10 75
  • 写在前面 本文仅是自己学习RunLoop的一个记录,参考了ibireme大神的 深入理解RunLoop[https...
    苏东没有坡阅读 7,674评论 0 8
  • 不得不说,人的惰性是真可怕啊。从上周六就到写runLoop的建议开始,星期三告诉自己从星期四开始着手写这篇博客。然...
    老司机Wicky阅读 7,199评论 20 137
  • 一、概念 runloop 程序在运行过程中循环的做一些事情; 二、 作用 处理下面的事件: 定时器 ...
    code_牧轩阅读 681评论 0 0
  • 此文转载自深入理解RunLoop,为了方便自己阅读,发在简书上RunLoop 是 iOS 和 OS X 开发中非常...
    渐行渐远ty阅读 414评论 0 0