詳解IOS中GCD的使用
Grand Central Dispatch(GCD)是異步執(zhí)行任務(wù)的技術(shù)之一。一般將應(yīng)用程序中記述的線程管理用的代碼在系統(tǒng)級中實現(xiàn)。開發(fā)者只需要定義想執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄ispatch Queue中,GCD就能生成必要的線程并計劃執(zhí)行任務(wù)。由于線程管理是作為系統(tǒng)的一部分來實現(xiàn)的,因此可統(tǒng)一管理,也可執(zhí)行任務(wù),這樣就比以前的線程更有效率。
1. GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案
GCD會自動利用更多的CPU內(nèi)核(比如雙核、四核)
GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程)
程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼
進(jìn)程:也就是一個正在運(yùn)行的應(yīng)用程序。
線程:進(jìn)程中的某一條完整的執(zhí)行路徑。一個進(jìn)程可以有多個線程,至少有一個線程,即主線程。在iOS開發(fā)中,所有涉及UI界面的,必須在主線程中更新。
2. GCD的工作原理:讓程序平行排隊,根據(jù)可用的處理資源,安排他們在任何可用的處理器上執(zhí)行任務(wù)
3. 串行隊列,并行隊列,同步任務(wù),異步任務(wù)。 異步任務(wù)會開辟線程:異步任務(wù)在串行隊列只開啟一個子線程,異步任務(wù)在并行隊列開啟多個子線程。
//GCD 并行隊列,異步任務(wù):開啟多個線程,同時執(zhí)行。 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); } }); //串行隊列,同步任務(wù) :不開啟線程,按順序執(zhí)行 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.我們平時使用多線程,會經(jīng)常碰到一種需求:子線程任務(wù)處理完成之后,需要主線程更新UI。我們?nèi)绾尾拍苤雷泳€程的任務(wù)都完成了。
當(dāng)我們使用串行隊列時,只需將最后的回調(diào)主線程任務(wù)添加在所有任務(wù)的最后,順序執(zhí)行,便可回調(diào)。 但是當(dāng)我們使用并行隊列時候,就無法知道什么時候完成所有的子線程任務(wù),
這時候,就得用到dispatch_group了。代碼如下:
//我們同時執(zhí)行幾個異步任務(wù),他們執(zhí)行完了,我們有時候還得知道一下,,怎么辦呢,這時候,就得用到dispatch_group了,如下編代碼這樣弄,到最后執(zhí)行 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(@"開始執(zhí)行1"); }); dispatch_group_async(group, queue, ^{ NSLog(@"開始執(zhí)行2"); }); dispatch_group_async(group, queue, ^{ NSLog(@"開始執(zhí)行3"); }); dispatch_group_notify(group, queue, ^{ NSLog(@"全部執(zhí)行完成,必須在主線程更新UI!!!"); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"主線程更新UI完成。"); }); });
以上內(nèi)容是小編給大家介紹的IOS中GCD的使用,希望對大家有所幫助!
相關(guān)文章
深入講解iOS開發(fā)中應(yīng)用數(shù)據(jù)的存儲方式
這篇文章主要介紹了iOS開發(fā)中應(yīng)用數(shù)據(jù)的存儲方式,包括plistXML屬性列表和NSKeydeArchiver歸檔兩個部分,需要的朋友可以參考下2015-12-12全面解析iOS中同步請求、異步請求、GET請求、POST請求
通過本文給大家全面解析了iOS中同步請求、異步請求、GET請求、POST請求,非常不錯,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-08-08iOS UIWebView 通過 cookie 完成自動登錄實例
本篇文章主要介紹了iOS UIWebView 通過 cookie 完成自動登錄實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04IOS 中l(wèi)oadView,viewDidLoad,viewDidUnload詳解及使用
這篇文章主要介紹了IOS 中l(wèi)oadView,viewDidLoad,viewDidUnload詳解及使用的相關(guān)資料,需要的朋友可以參考下2017-02-02