1. 程式人生 > >IOS RunLoop淺析 二

IOS RunLoop淺析 二

logs end resources cfa activity 操作 調用棧 for right

上一篇我們說了runloop 的幾種模式,那麽我們在模式中又要做些什麽呢???

模式中有三個模塊:

事件源(輸入源) Source

Source:

按照官方文檔分類

Port-Based

Custom Input

Cocoa Perform Selector

按照函數調用棧,Source的分類

Source0:非基於Port的

Source1:基於Port的,通過內核和其他線程通信,接受,分發系統事件。

(這裏沒什麽太大用,剩下的Source概念我就不介紹了有興趣可以去別處查查)

觀察者 Observer

觀察者的作用便是監聽runloop中正在執行的狀態

狀態有以下幾種

所監聽的狀態:

kCFRunLoopEntry = (1UL << 0), 1

kCFRunLoopBeforeTimers = (1UL << 1), 2

kCFRunLoopBeforeSources = (1UL << 2), 4

kCFRunLoopBeforeWaiting = (1UL << 5), 32

kCFRunLoopAfterWaiting = (1UL << 6), 64

kCFRunLoopExit = (1UL << 7), 128

kCFRunLoopAllActivities = 0x0FFFFFFFU

我們可以選擇監聽不同的狀態實現不同的操作

下面的代碼中是實現見天所有狀態

技術分享
//
//  ViewController.m
//  CX RunLoop淺析
//
//  Created by ma c on 16/3/29.
//  Copyright ? 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //添加observe
    /* 所監聽的狀態
     kCFRunLoopEntry = (1UL << 0),  1
     kCFRunLoopBeforeTimers = (1UL << 1),  2
     kCFRunLoopBeforeSources = (1UL << 2),  4
     kCFRunLoopBeforeWaiting = (1UL << 5),  32
     kCFRunLoopAfterWaiting = (1UL << 6),  64
     kCFRunLoopExit = (1UL << 7),  128
     kCFRunLoopAllActivities = 0x0FFFFFFFU
     */
    CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        
        NSLog(@"監聽到runloop-- %zd",activity);
        
    });
    //添加觀察者
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode);
}
@end
技術分享

演示效果為:

技術分享

仔細觀察不難發現當運行到最後我不在操作時,日誌停止打印。

這是為什麽呢???仔細觀察所有狀態便知道,因為到了休眠狀態。

為了證明這一觀點 我們一直點擊屏幕測試一下。

技術分享

(測試結果後面一直輸出32實際上是不符合邏輯的,因為我在一直*快速*點擊。)

(正常情況應該會出現64等)

因為沒有其他狀態存在所以一直為休眠狀態(具體流程我會在下一篇進行介紹)

掌握好這一點對開發會有很大好處。

定時器 NSTimer

由於第一篇是用定時器簡單介紹了runloop因此在這裏就不加以追訴。

沒有看到第一篇的可以在文章結尾處點擊上一篇即可。

    

IOS RunLoop淺析 二