1.CFRunloopSourceRef
1.是事件源也就是输入源,有两种分类模式;
一种是按照苹果官方文档进行划分的
另一种是基于函数的调用栈来进行划分的(source0和source1)。
2.具体的分类情况
(1)以前的分法
Port-Based Sources
Custom Input Sources
Cocoa Perform Selector Sources
(2)现在的分法
Source0:非基于Port的 用户主动触发的事件
Source1:基于Port的 系统通知的事件
3.可以通过打断点的方式查看一个方法的函数调用栈
2.CFRunLoopObserverRef
(1)CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
(2)如何监听
//创建一个runloop监听者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities,YES,0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"监听runloop状态改变---%zd",activity);
});
//为runloop添加一个监听者
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
CFRelease(observer);
(3)监听的状态
typedefCF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL <<0),//即将进入Runloop
kCFRunLoopBeforeTimers = (1UL <<1),//即将处理NSTimer
kCFRunLoopBeforeSources = (1UL <<2),//即将处理Sources
kCFRunLoopBeforeWaiting = (1UL <<5),//即将进入休眠
kCFRunLoopAfterWaiting = (1UL <<6),//刚从休眠中唤醒
kCFRunLoopExit = (1UL <<7),//即将退出runloop
kCFRunLoopAllActivities =0x0FFFFFFFU//所有状态改变
};
3.Runloop运行逻辑