天天看點

iOS學習筆記-138.RunLoop06——Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRefRunLoop06——Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRef

  • 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 圖示

iOS學習筆記-138.RunLoop06——Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRefRunLoop06——Runloop相關類4_ CFRunloopSourceRef和CFRunLoopObserverRef

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] 即将進入睡眠