iOS開發多執行緒學習總結 - GCD的使用
文章內容和排版參考: iOS 多執行緒: [GCD]詳盡總結
GCD - 核心概念: 任務 | 佇列
任務: 就是指需要執行的程式碼, 在block中編寫,有 同步執行 和 非同步執行 兩種方式. 舉例:
同步執行 -- 小時候爸媽說吃飯的時候不能看電視,要先吃完飯,才能去看電視,
非同步執行 -- 一邊吃飯一邊看電視,還可以同時做其他的事情.
- 同步執行(sync) -- 使用 dispatch_sync(queue,^{需要執行的程式碼})
- 在任務執行完之前會一直等待,直到佇列裡的任務完成之後再執行
- 不會開啟新的執行緒,只在當前執行緒執行
- 非同步執行(async) -- 使用 dispatch_async(queue,^{需要執行的程式碼})
- 不會等待,可以直接執行任務
- 會開啟新的執行緒,可以在新的執行緒中執行
佇列(Queue): 執行任務的等待佇列, 用於存放任務, 有序列佇列 和 併發佇列
- 序列佇列(Serial)
- 任務只能一個接一個的執行(食堂只有一個視窗,多個人需要排隊買飯)
- 主佇列是特殊的序列佇列
- 併發佇列(Concurrent )
- 多個任務可以同時執行(食堂開啟多個視窗,多個人可以同時買飯)
- 全域性併發佇列是併發佇列(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種,可以在文章開頭的參考文章內檢視