天天看點

iOS多線程GCD入門

iOS多線程GCD入門

1.簡介

GCD,Grand Central Dispatch,開發者要做的隻是1定義想執行的任務并2追加到适當的Dispatch Queue中。

2.隊列Queue

可以了解成幾個任務(代碼Block)在排隊上WC,隊伍的種類分成兩種:1.Serial Dispatch Queue串行,2.Concurrent Dispatch Queue并行。

串行就是這些任務就隻有一個WC,并行是有多個WC。

3.建立隊列 dispatch_queue_create

dispatch_queue_t myQueue = dispatch_queue_create("com.test.serialQueue", DISPATCH_QUEUE_SERIAL);           

函數的第一個參數是隊列名稱,調試時會用,不要重名,第二個參數是隊列種類。

隊列種類有兩種:DISPATCH_QUEUE_SERIAL和DISPATCH_QUEUE_CONCURRENT。

4.使用隊列(異步使用)

異步串行:使用異步串行隊列即是生成了一個線程按順序執行隊列中的任務。

串行就好比一個WC,幾個任務排隊去,先排隊的先去,FIFO,一次一個,當人不能兩個任務一塊進了

iOS多線程GCD入門

//異步
    //串行隊列
    dispatch_queue_t serialQueue = dispatch_queue_create("com.test1.serialQueue",DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(serialQueue, ^{
        NSLog(@"test 1");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 2");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 3");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 4");
    });
    
    NSLog(@"test Main");           

輸出結果為:

2017-02-13 14:17:53.277 UIKitLearn[3937:137154] test Main
2017-02-13 14:17:53.277 UIKitLearn[3937:137199] test 1
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 2
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 3
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 4           

異步并行:使用異步并行,即是建立多個線程去并列執行隊列中的任務,建立的線程數并不一定等于隊列中的任務數,因為硬體系統限制,線程數量不是無限多的。

就好比幾個任務上WC,一個有仨WC,當然會排成3個線程了。

//異步
    //并行隊列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.test2.serialQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 1");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 2");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 3");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 4");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 5");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 6");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 7");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 8");
    });
    NSLog(@"test Main");
    
           

輸出結果為:

2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 2
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 1
2017-02-13 14:31:01.195 UIKitLearn[4110:143839] test 3
2017-02-13 14:31:01.195 UIKitLearn[4110:143824] test 4
2017-02-13 14:31:01.195 UIKitLearn[4110:143914] test 5
2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 6
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 7
2017-02-13 14:31:01.195 UIKitLearn[4110:143915] test 8           

并不想串行那樣按順序執行,我們在中間打個斷點:

iOS多線程GCD入門

這裡就看到了我們生成的線程,這裡要提一點的是,現在版本的iOS,GCD已經加入ARC,如果是老版本的,還要自己release建立的隊列。

5.系統标準線程

上面提到的都是我們自己異步添加隊列建立的線程,實際上系統會為我們提供幾個線程:Main Dispatch Queue 和 Global Dispatch Queue。

Main Dispatch Queue是在主線程中執行的隊列,擷取方式:

//擷取主線程隊列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
               

千萬不要阻塞主線程,使用者會幹死你,老闆會開除你,老婆會不要你。

Global Dispatch Queue,是所有應用程式都能夠使用的Concurrent Dispatch Queue,其有4個優先級:最高優先級(High Priority),預設優先級(Default Priority),低優先級(Low Priority)和 背景優先級(Background Priority)。

dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_async(globalDispatchQueueLow, ^{
        NSLog(@"low");
    });
    
    dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(globalDispatchQueueHigh, ^{
        NSLog(@"high");
    });           

輸出結果:

2017-02-13 14:46:13.973 UIKitLearn[4312:152074] high
2017-02-13 14:46:13.973 UIKitLearn[4312:152072] low