iOS中多執行緒之GCD應用

Eric君發表於2018-01-03

GCD是Grand Central Dispatch的縮寫,是蘋果對多核硬體上執行併發程式碼的一種支援。它有以下優點:

  • GCD通過把計算密集型任務放於後臺執行,以此提高APP的響應速度。
  • GCD提供了更簡單的併發模型,它優於執行緒鎖,並且幫助你避免併發bug。
  • GCD基於底層、高效能的優化常規型別的程式碼,例如單例。

GCD常用方法介紹:

  1. 後臺執行
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //後臺執行程式碼段
    });
複製程式碼
  1. 主執行緒執行程式碼
    dispatch_async(dispatch_get_main_queue(), ^{
        //主執行緒執行程式碼段
    });
複製程式碼
  1. 一次性執行(多用於單例模式)
static dispatch_once_t once;
    dispatch_once(&once, ^{
       //只執行一次的程式碼段
    });
複製程式碼
  1. 延遲操作執行
float delaySeconds = 3.0f;
    dispatch_time_t disTime = dispatch_time(DISPATCH_TIME_NOW, delaySeconds * NSEC_PER_SEC);
    dispatch_after(disTime, dispatch_get_main_queue(), ^{
        //延遲執行的程式碼段
    });
複製程式碼
  1. 建立序列佇列,一次只能執行一個任務, 當前任務完成才開始出列並啟動下一個任務
    dispatch_queue_t serialQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        //code 任務一
        NSLog(@"序列佇列:任務一");
    });
    
    dispatch_async(serialQueue, ^{
        //code 任務二
        NSLog(@"序列佇列:任務二");
    });
複製程式碼
  1. 建立並行佇列,儘可能多地啟動任務併發執行
    dispatch_queue_t concurrentQueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^{
        //code 任務一
        NSLog(@"並行佇列:任務一");
    });
    
    dispatch_async(concurrentQueue, ^{
        //code 任務二
        NSLog(@"並行佇列:任務二");
    });
複製程式碼
  1. 讓後臺多個執行緒並行執行,然後等整個group的執行緒都結束後,再彙總執行結果
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //並行執行緒一
        NSLog(@"notify:並行執行緒一");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //並行執行緒二
        NSLog(@"notify:並行執行緒二");
    });
    //會等整個group執行完才執行操作
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        //彙總結果
        NSLog(@"notify:任務一二三都執行完成");
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //並行執行緒三
        NSLog(@"notify:並行執行緒三");
    });
複製程式碼
  1. 讓後臺多個執行緒並行執行,然後上面的執行緒都執行結束後,再彙總執行後面的執行緒
    dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(conCurrentQueue, ^{
        //並行執行緒一
        NSLog(@"barrier:並行執行緒一");
    });
    dispatch_async(conCurrentQueue, ^{
        //並行執行緒二
        NSLog(@"barrier:並行執行緒二");
    });
    dispatch_barrier_async(conCurrentQueue, ^{
        //彙總一二執行緒
        NSLog(@"barrier:任務一二都執行完成");
    });
    dispatch_async(conCurrentQueue, ^{
        //並行執行緒三
        NSLog(@"barrier:並行執行緒三");
    });
    dispatch_async(conCurrentQueue, ^{
        //並行執行緒四
        NSLog(@"barrier:並行執行緒四");
    });
複製程式碼

以後若有其他應用場景,再行補充。若有寫得不好的地方,請大家指出。

相關文章