09-dispatch_source

葉喬木發表於2018-12-14

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);