iOS邊練邊學--GCD的基本使用、GCD各種隊列、GCD線程間通信、GCD常用函數、GCD迭代以及GCD隊列組


一、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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM