- RunLoop06Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRef
- 一CFRunloopSourceRef
- 二CFRunLoopObserverRef
- 1 如何監聽
- 2 代碼示例
- 3 CFRunLoopActivity
- 4 圖示
- 5 運作結果
RunLoop06——Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRef
一、CFRunloopSourceRef
1.是事件源也就是輸入源,有兩種分類模式;
一種是按照蘋果官方文檔進行劃分的
另一種是基于函數的調用棧來進行劃分的(source0和source1)。
2.具體的分類情況
(1)以前的分法
Port-Based Sources
Custom Input Sources
Cocoa Perform Selector Sources
(2)現在的分法
Source0:非基于Port的(使用者主動出發的)
Source1:基于Port的(系統内部的消息事件)
3.可以通過打斷點的方式檢視一個方法的函數調用棧
二、CFRunLoopObserverRef
CFRunLoopObserverRef是觀察者,能夠監聽RunLoop的狀态改變
2.1 如何監聽
//建立一個runloop監聽者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities, YES, , ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"監聽runloop狀态改變---%zd",activity);
});
//為runloop添加一個監聽者
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
CFRelease(observer);
2.2 代碼示例
//
// ViewController.m
// 03_UIView93_ CFRunloopObserverRef和CFRunloopSourceRef
//
// Created by 杞文明 on 17/9/11.
// Copyright © 2017年 杞文明. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
-(void)viewDidLoad{
[self observerCreate];
}
- (IBAction)btnClick:(id)sender {
NSLog(@"----%s",__func__);
}
-(void)observerCreate{
//1.建立監聽者
/*
第一個參數:怎麼配置設定存儲空間
第二個參數:要監聽的狀态 。kCFRunLoopAllActivities 所有的狀态
第三個參數:是否持續監聽
第四個參數:優先級 總是傳0
第五個參數:當狀态改變時候的回調
*/
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, , ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"即将進入runloop");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即将處理timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即将處理source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即将進入睡眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被喚醒");
break;
case kCFRunLoopExit:
NSLog(@"runloop退出");
break;
default:
break;
}
});
//2.添加監聽者
/*
第一個參數:要監聽哪個runloop
第二個參數:觀察者
第三個參數:運作模式
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
}
@end
2.3 CFRunLoopActivity
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (L << ), 即将進入runloop
kCFRunLoopBeforeTimers = (L << ), 即将處理timer事件
kCFRunLoopBeforeSources = (L << ), 即将處理source事件
kCFRunLoopBeforeWaiting = (L << ), 即将進入睡眠
kCFRunLoopAfterWaiting = (L << ), 被喚醒
kCFRunLoopExit = (L << ), runloop退出
kCFRunLoopAllActivities = U
};
2.4 圖示
2.5 運作結果
[74454:384907] 被喚醒
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将進入睡眠
[74454:384907] 被喚醒
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] -----[ViewController btnClick:]
[74454:384907] 即将處理timer事件
[74454:384907] 即将處理source事件
[74454:384907] 即将進入睡眠