iOS GCD的使用,iOSGCD使用
GCD Grand Central Dispatch 純C語言編寫
1. GCD是蘋果公司為多核的並行運算提出的解決方案
GCD會自動利用更多的CPU核心(比如雙核、四核)
GCD會自動管理線程的生命週期(建立線程、調度任務、銷毀線程)
程式員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼
進程:也就是一個正在啟動並執行應用程式。
線程:進程中的某一條完整的執行路徑。一個進程可以有多個線程,至少有一個線程,即主線程。在iOS開發中,所有涉及UI介面的,必須在主線程中更新。
2. GCD的工作原理:讓程式平行排隊,根據可用的處理資源,安排他們在任何可用的處理器上執行任務
3. 串列隊列,並行隊列,同步任務,非同步任務。 非同步任務會開闢線程:非同步任務在串列隊列只開啟一個子線程,非同步任務在並行隊列開啟多個子線程。
//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了。代碼如下:
//我們同時執行幾個非同步任務,他們執行完了,我們有時候還得知道一下,,怎麼辦呢,這時候,就得用到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完成。"); }); });
*以上如有不對的地方,歡迎各位指正,同時也歡迎大家交流。