GCD(一次性代碼、柵欄函數、延遲執行、定時器)

GCD(一次性代碼、柵欄函數、延遲執行、定時器)

 

一次性代碼多用於單例

做用:程序運行過程當中直到銷燬只會執行一次`併發

- (void)once{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"once");
    });
}

延遲執行

- (void)delay
{   
    // 1.延遲執行的第一種方法
    [self performSelector:@selector(task) withObject:nil afterDelay:2.0];

    // 2.延遲執行的第二種方法
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];

    // 3.延遲執行的第三種方法
    /**
     第一個參數:DISPATCH_TIME_NOW 從如今開始計算事件
     第二個參數:延遲的時間 GCD時間單位:那秒
     第叄個參數:隊列
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"GCD ----  %@",[NSThread currentThread]);
    });
}
- (void)task
{
    NSLog(@"task ----  %@",[NSThread currentThread]);
}

柵欄函數

做用:只有當柵欄函數執行完畢後才能執行後面的函數
需求:使用柵欄函數規定線程執行順序異步

注意點:柵欄函數不能使用全局併發隊列
再次強調:柵欄函數不能使用全局併發隊列
再再次強調:柵欄函數不能使用全局併發隊列async

使用示例

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
    //1.異步函數
    dispatch_async(queue, ^{
        for (NSInteger i =0 ; i < 5 ; i++){
            NSLog(@"download1 -- %zd -- %@",i,[NSThread currentThread]);
        }
    });

    dispatch_async(queue, ^{
        for (NSInteger i =0 ; i < 5 ; i++){
            NSLog(@"download2 -- %zd -- %@",i,[NSThread currentThread]);
        }
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"+++++++++++++++");
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i =0 ; i < 5 ; i++){
            NSLog(@"download3 -- %zd -- %@",i,[NSThread currentThread]);
        }
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"+++++++++++++++");
    });
    
    dispatch_async(queue, ^{
        for (NSInteger i =0 ; i < 5 ; i++){
            NSLog(@"download4 -- %zd -- %@",i,[NSThread currentThread]);
        }
    });
}

輸出結果:函數

GCD裏面的定時器,絕對精準,不受Runloop影響

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 1.建立GCD中的定時器
    // 1.1 DISPATCH_SOURCE_TYPE_TIMER Source類型 表示定時器
    // 1.2 描述信息:線程ID
    // 1.3 更詳細的描述信息
    // 1.4 隊列,決定GCD定時器中的任務在哪一個線程中執行
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
    // 2.設置定時器(起始時間|間隔時間|精準度)
    // 2.1 定時器對象
    // 2.2 起始時間,DISPATCH_TIME_NOW 從如今開始計時
    // 2.3 間隔時間 , 2.0 GCD中時間爲納秒
    // 2.4 精準度 絕對精準 0
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    // 3.設置定時器執行任務
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"GCD --- %@",[NSThread currentThread]);
    });
    // 4.啓動執行
    dispatch_resume(timer);
    
    self.timer = timer;
    // 啓動程序,不執行的緣由:是由於2秒後timer被釋放
}
相關文章
相關標籤/搜索