IOS RunLoop淺析 二
上一篇我們說了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淺析 二