1. 程式人生 > >iOS開發多執行緒學習總結 - GCD的使用

iOS開發多執行緒學習總結 - GCD的使用

文章內容和排版參考: iOS 多執行緒: [GCD]詳盡總結

GCD - 核心概念:  任務 | 佇列

任務: 就是指需要執行的程式碼, 在block中編寫,有 同步執行 和 非同步執行 兩種方式.  舉例:

 同步執行 -- 小時候爸媽說吃飯的時候不能看電視,要先吃完飯,才能去看電視,

 非同步執行 -- 一邊吃飯一邊看電視,還可以同時做其他的事情.

  • 同步執行(sync) -- 使用 dispatch_sync(queue,^{需要執行的程式碼})
  1. 在任務執行完之前會一直等待,直到佇列裡的任務完成之後再執行
  2. 不會開啟新的執行緒,只在當前執行緒執行
  • 非同步執行(async) -- 使用 dispatch_async(queue,^{需要執行的程式碼})
  1. 不會等待,可以直接執行任務
  2. 會開啟新的執行緒,可以在新的執行緒中執行

佇列(Queue):  執行任務的等待佇列, 用於存放任務, 有序列佇列 和 併發佇列

  • 序列佇列(Serial)
  1. 任務只能一個接一個的執行(食堂只有一個視窗,多個人需要排隊買飯)
  2. 主佇列是特殊的序列佇列
    (獲取主佇列:dispatch_get_main_queue())
  •  併發佇列(Concurrent )
  1. 多個任務可以同時執行(食堂開啟多個視窗,多個人可以同時買飯)
  2. 全域性併發佇列是併發佇列(dispatch_get_global_queue())

GCD - 使用

在沒有詳細學習的時候,對GCD的使用總是很混亂,每次都要百度. 在使用時只需要記住: 建立佇列、建立任務.

1. 建立佇列

    dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_CONCURRENT);

    說明: 引數1 是佇列唯一識別符號(可以為空),引數二是佇列型別,SERIAL(序列佇列)CONCURRENT(併發佇列)

2. 建立任務

    2.1 建立同步執行 + 序列佇列

    - (void)testSerial {

         dispatch_queue_t queue = dispatch_queue_create("test1", DISPATCH_QUEUE_SERIAL);

         // 同步任務

         dispatch_sync(queue, ^{

              [NSThread sleepForTimeInterval:3.0];

              NSLog(@"執行block");

         });

         NSLog(@"執行結束");

}        

     2.2 建立非同步執行 + 併發佇列

- (void)testConcurrent {

    dispatch_queue_t queue = dispatch_queue_create("test2", DISPATCH_QUEUE_CONCURRENT);

    //  非同步任務

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:3.0];

        NSLog(@"執行block");

    });

    NSLog(@"執行結束");

}

3. 執行結果對比

同步 + 序列(圖1)

非同步 + 並行(圖2)

效果說明:

圖1中在3s後列印了執行block和執行結束;

圖2中先列印了執行結束再在3S後列印了執行block.

可以發現同步任務需要將block中的程式碼執行完再接著往下執行其他程式碼,但是非同步任務在執行block的同時,下面的程式碼也會執行.

 

任務和佇列的組合方式有6種,可以在文章開頭的參考文章內檢視