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(监听所有状态)