Grand Central Dispatch(GCD)是異步執行任務的技術之一。一般將應用程序中記述的線程管理用的代碼在系統級中實現。開發者只需要定義想執行的任務并追加到適當的Dispatch Queue中,GCD就能生成必要的線程并計劃執行任務。由于線程管理是作為系統的一部分來實現的,因此可統一管理,也可執行任務,這樣就比以前的線程更有效率。
1. GCD是蘋果公司為多核的并行運算提出的解決方案
GCD會自動利用更多的CPU內核(比如雙核、四核)
GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)
程序員只需要告訴GCD想要執行什么任務,不需要編寫任何線程管理代碼
進程:也就是一個正在運行的應用程序。
線程:進程中的某一條完整的執行路徑。一個進程可以有多個線程,至少有一個線程,即主線程。在iOS開發中,所有涉及UI界面的,必須在主線程中更新。
2. GCD的工作原理:讓程序平行排隊,根據可用的處理資源,安排他們在任何可用的處理器上執行任務
3. 串行隊列,并行隊列,同步任務,異步任務。 異步任務會開辟線程:異步任務在串行隊列只開啟一個子線程,異步任務在并行隊列開啟多個子線程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//GCD 并行隊列,異步任務:開啟多個線程,同時執行。 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ); dispatch_async(queue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "AAAAA %d" ,i); } }); dispatch_async(queue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "BBBBB %d" ,i); } }); dispatch_async(queue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "CCCCC %d" ,i); } }); //串行隊列,同步任務 :不開啟線程,按順序執行 dispatch_queue_t Cqueue = dispatch_queue_create( "queueName" , NULL); dispatch_sync(Cqueue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "DDDDD %d" ,i); } }); dispatch_sync(Cqueue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "EEEEE %d" ,i); } }); dispatch_sync(Cqueue, ^{ for ( int i = 0 ; i< 1000 ; i++) { NSLog(@ "FFFFF %d" ,i); } }); |
4.我們平時使用多線程,會經常碰到一種需求:子線程任務處理完成之后,需要主線程更新UI。我們如何才能知道子線程的任務都完成了。
當我們使用串行隊列時,只需將最后的回調主線程任務添加在所有任務的最后,順序執行,便可回調。 但是當我們使用并行隊列時候,就無法知道什么時候完成所有的子線程任務,
這時候,就得用到dispatch_group了。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//我們同時執行幾個異步任務,他們執行完了,我們有時候還得知道一下,,怎么辦呢,這時候,就得用到dispatch_group了,如下編代碼這樣弄,到最后執行 dispatch_group_notify ,便可 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ NSLog(@ "開始執行1" ); }); dispatch_group_async(group, queue, ^{ NSLog(@ "開始執行2" ); }); dispatch_group_async(group, queue, ^{ NSLog(@ "開始執行3" ); }); dispatch_group_notify(group, queue, ^{ NSLog(@ "全部執行完成,必須在主線程更新UI!!!" ); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@ "主線程更新UI完成。" ); }); }); |
以上內容是小編給大家介紹的IOS中GCD的使用,希望對大家有所幫助!