09-dispatch_source
dispatch_source
是BSD系核心慣有的kqueue的包裝,kqueue 是XNU核心中發生各種事件時,在應用程式程式設計中執行處理的技術。
CPU 負荷非常小,儘量不佔用資源。
dispatch_queue 和dispatch_source
dispatch_source 是可以取消的,取消也是有對應的回撥的。
dispatch source的種類
名稱 | 內容 |
---|---|
DISPATCH_SOURCE_TYPE_READ | 可讀取檔案映像 |
DISPATCH_SOURCE_TYPE_PROC | 檢測到與程式相關的事件 |
DISPATCH_SOURCE_TYPE_SIGNAL | 接收訊號 |
DISPATCH_SOURCE_TYPE_TIMER | 定時器 |
DISPATCH_SOURCE_TYPE_VNODE | 檔案系統有變更 |
DISPATCH_SOURCE_TYPE_WRITE | 可寫入檔案映像 |
DISPATCH_SOURCE_TYPE_DATA_ADD | 變數增加 |
DISPATCH_SOURCE_TYPE_DATA_OR | 變數or |
DISPATCH_SOURCE_TYPE_MACH_SEND | MACH 埠傳送 |
DISPATCH_SOURCE_TYPE_MACH_RECV | MACH 埠接收 |
定時器示例
// 建立定時器
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
// 設定定時器
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0);
// 定時器處理
dispatch_source_set_event_handler(timer, ^{
NSLog(@"log一下子");
// 定時器取消
// dispatch_source_cancel(timer)
});
// 取消的回撥
dispatch_source_set_cancel_handler(timer, ^{
NSLog(@"定時器取消了");
});
驗證碼倒數計時
__block int timeout= 59; //倒數計時時間
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){ //倒數計時結束,關閉
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
//設定介面的按鈕顯示 根據自己需求設定
[self->_verifyBtn setTitle:@"獲取驗證碼" forState:UIControlStateNormal];
self->_verifyBtn.userInteractionEnabled = YES;
});
}else{
int seconds = timeout % 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//設定介面的按鈕顯示 根據自己需求設定
[self->_verifyBtn setTitle:[NSString stringWithFormat:@"%@秒重發",strTime] forState:UIControlStateNormal];
self->_verifyBtn.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);