併發 (三):Group Dispatch and DIY Dispatch

將GCD任務集合起來

目的:將代碼塊集合到一起,確保他們在GCD機制下,一個接一個的執行,就像是相互依靠。
解決方法:dispatch_group_create 來建立集合

先了解下Group的四個方法:

  1. dispatch_group_create
  2. dispatch_group_async
  3. dispatch_group_notify
  4. dispatch_group_release

1和4搭配使用,2要指定調度隊列,3是允許你在添加到group中的所有任務執行完之後,彙總再執行別的任務。

實例:有三個方法我們想依次調用,都調用完了,然後再給用戶一個提示信息。

 dispatch_group_t taskGroup = dispatch_group_create();
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadTableView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadScrollView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadImageView];
    });
    dispatch_group_notify(taskGroup, mainQueue, ^{
        /**
         *  自己隨便寫點什麼提示消息吧
         */
    });

    dispatch_release(taskGroup);//ARC下可以省略

C函數實現方法:略,不想寫了

創建你自己的GCD調度隊列

這樣創建的是serial queue(串行隊列),它將會用到:
dispatch_queue_create、dispatch_release、dispatch_async
其中create方法的第一個參數是一個C的字符串類型char*,第二個參數爲0。
而dispatch_async在這裏使用的原因是:dispatch_sync是FIFO原則執行,而一個隊列上的併發任務不會在主線程上執行,這個機制可以令串行隊列更加高效。


dispatch_queue_t firstSerialQueue =
dispatch_queue_create("com.company.product.serialQueue1", 0);

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"First iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"Second iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_async(firstSerialQueue, ^{
    NSUInteger counter = 0;
    for (counter = 0; counter<5; counter++) {
        NSLog(@"Third iteration, counter = %lu",(unsigned long)counter);
    }
});

dispatch_release(firstSerialQueue);//ARC下不需要

打印出來的結果是

First iteration, counter = 0
First iteration, counter = 1
First iteration, counter = 2
First iteration, counter = 3
First iteration, counter = 4
Second iteration, counter = 0
Second iteration, counter = 1
Second iteration, counter = 2
Second iteration, counter = 3
Second iteration, counter = 4
Third iteration, counter = 0
Third iteration, counter = 1
Third iteration, counter = 2
Third iteration, counter = 3
Third iteration, counter = 4
發佈了59 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章