iOS runloop(二)

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运行逻辑 

iOS runloop(二)_第1张图片


iOS runloop(二)_第2张图片

你可能感兴趣的:(iOS runloop(二))