一、GCD的基本使用
<1>GCD簡介
- 什么是GCD
-
- 全稱是Grand Central Dispatch,可譯為“牛逼的中樞調度器”
-
- 純C語言,提供了非常多強大的函數
- GCD的優勢
-
- GCD是蘋果公司為多核的並行運算提出的解決方案
- GCD會自動利用更多的CPU內核(比如雙核、四核)
- GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)
- 程序員只需要告訴GCD想要執行什么任務,不需要編寫任何線程管理代碼
<2>GCD的使用
- GCD的使用就2個步驟
-
- 定制任務
- 確定想做的事情
- 將任務添加到隊列中
-
- GCD會自動將隊列中的任務取出,放到對應的線程中執行
- 任務的取出遵循隊列的FIFO原則:先進先出,后進后出
<3>GCD的兩個函數

<4>GCD中容易混淆的術語

二、GCD中的各種隊列代碼示例
<1>異步函數 + 並發隊列

<2>同步函數 + 並發隊列

<3>異步函數 + 串行隊列

<4>同步函數 + 串行隊列

<5>異步函數 + 主隊列

<6>同步函數 + 主隊列

- 各種隊列執行結果總結

三、GCD線程間的通信
- 小練習 -- 利用GCD下載圖片,並顯示

四、GCD常用函數
<1>延時執行的三種方法,這里再整理一遍

<2>一次性代碼

<3>GCD barrier(屏障方法)

五、GCD迭代
- 小練習 -- 將from文件夾中的圖片文件 快速 剪切 到to文件夾中

六、GCD隊列組
- 小練習 -- 下載兩張圖片,最后合成一張
1 // 隊列組 -- 先將分組內的任務完成,再繼續完成別的任務 2 // -- 小練習,開啟線程同時加載兩張圖片,最后開啟線程合成兩張圖片 3 - (void)group 4 { 5 // 創建組隊列 6 dispatch_group_t group = dispatch_group_create(); 7 8 // 下載圖片,添加到組隊列中執行 9 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 10 11 NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTC9Yx9QWW8eh4xEVDZnBATSZXQHkL0LTM9hTdzjqeoT6jkrjzBGg"]; 12 13 NSData *data = [NSData dataWithContentsOfURL:url]; 14 15 self.image1 = [UIImage imageWithData:data]; 16 }); 17 18 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 19 20 NSURL *url = [NSURL URLWithString:@"https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQkEXf64P3SfSaLmFdjn9IwjGk5wMtZRfqivcijRplqMLUJbbm7kaNhaCsV"]; 21 22 NSData *data = [NSData dataWithContentsOfURL:url]; 23 24 self.image2 = [UIImage imageWithData:data]; 25 }); 26 27 // 合成圖片,隊列中的任務執行完后,執行這段代碼 28 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 29 30 // 開啟新的圖形上下文 31 UIGraphicsBeginImageContext(CGSizeMake(300, 150)); 32 33 // 繪制圖片 34 [self.image1 drawInRect:CGRectMake(0, 0, 150, 150)]; 35 [self.image2 drawInRect:CGRectMake(150, 0, 150, 150)]; 36 37 // 取得上下文中的圖片 38 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 39 40 // 結束上下文 41 UIGraphicsEndImageContext(); 42 43 // 回到主線程顯示圖片 44 dispatch_async(dispatch_get_main_queue(), ^{ 45 // 4.將新圖片顯示出來 46 self.imageView.image = image; 47 }); 48 }); 49 }
