1.CFRunloopSourceRef
1.是事件源也就是輸入源,有兩種分類模式煎殷;
一種是按照蘋果官方文檔進行劃分的
另一種是基于函數(shù)的調用棧來進行劃分的(source0和source1)。
2.具體的分類情況
(1)以前的分法
Port-Based Sources
Custom Input Sources
Cocoa Perform Selector Sources
(2)現(xiàn)在的分法
Source0:非基于Port的 用戶主動觸發(fā)的事件
Source1:基于Port的 ? 系統(tǒng)通知的事件
3.可以通過打斷點的方式查看一個方法的函數(shù)調用棧
2.CFRunLoopObserverRef
(1)CFRunLoopObserverRef是觀察者腿箩,能夠監(jiān)聽RunLoop的狀態(tài)改變
(2)如何監(jiān)聽
//創(chuàng)建一個runloop監(jiān)聽者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities,YES,0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"監(jiān)聽runloop狀態(tài)改變---%zd",activity);
});
//為runloop添加一個監(jiān)聽者
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
CFRelease(observer);
(3)監(jiān)聽的狀態(tài)
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//所有狀態(tài)改變
};
3.Runloop運行邏輯?