一什麼是GCD :(Grand [偉大] Central [中央] Dispatch[調度])xcode
GCD又名「偉大的中央調度器」,他是iOS4後才引進的一種多線程技術。開發者只需定義想執行的任務兵追加到Dispatch Queue(調度隊列)中。GCD就能生成必要的線程並有計劃的執行任務。GCD的實質其實就是隊列。多線程
二GCD的優點併發
1.GCD的出現解決了多核並行運算的問題異步
2.GCD自動管理線程的生命週期async
3.只需描寫任務,無需編寫任何線程管理的代碼spa
注:由dispatch_queue_create方法生成的Dispatch Queue並不能由ARC來自動管理內存。能夠使用dispatch_release、dispatch_retain來手動管理(引用計數式),但在目前看來,所用的OSX-10.8 開啓的ARC已經不須要再用dispatch_release()來作管理線程
三GCD的遵循的規則調試
GCD中任務的取出遵循隊列的FIFO原則:先進先出,後進後出。code
四GCD執行任務的方式生命週期
建立串行隊列
dispatch_queue_t queue = dispatch_queue_create("first" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL被系統默認爲NULL,他是串行隊列的標示符
1.串行隊列同步執行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 關鍵詞sync表示同步
串行隊列同步執行:不會開闢線程,按順序逐步執行(即會耗費內存,又無加快程序運行速度,基本上毫無心義)。
2.串行隊列異步執行:dispatch_async(queue, ^{ NSLog(@"1"); }); 關鍵詞async表示異步
串行隊列異步執行: 會開闢線程,隊列內的任務會逐步執行,線程內的任務與線程外的任務併發執行(頗有用)。
建立並行隊列
dispatch_queue_t queue = dispatch_queue_create("second" , DISPATCH_QUEUE_SERIAL); DISPATCH_QUEUE_SERIAL是並行隊列的標誌
3.並行隊列同步執行:dispatch_sync(queue, ^{ NSLog(@"1"); }); 關鍵詞sync表示同步
並行隊列同步執行:不會開闢線程,按照順序執行。(基本上沒有用)。
4.並行隊列異步執行:dispatch_async(queue, ^{ NSLog(@"1"); }); 關鍵詞async表示異步
並行隊列異步執行: 會開闢多個線程,線程的多少由GCD底層決定。對列的任務會同步執行(沒法肯定隊列內任務的執行順序,易出錯)。
總結:同步執行的隊列不會開闢線程,異步會開闢線程
四.GCD中的兩個特殊隊列
1.主隊列:放到主隊列中的任務,都會放到主線程中執行。
使用dispatch_get_main_queue()得到主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
每個應用程序只有一個主線程即只有一個主隊列,主隊列中的操做都是在主線程中執行的,不存在異步的概念。
注:主隊列中添加的同步操做永遠不會被執行(會死鎖)
2.全局隊列的生成
ispatch_async(dispatch_get_global_queue(0, 0), ^{ })
全局隊列:全局隊列是系統的,直接拿過來就能夠用,與並行隊列相似,可是不能指定隊列的名字,調試時沒法確認任務所在隊列
在全局隊列中執行同步任務:不會新建線程,按順序執行任務
在全局隊列中執行異步任務:會新建多個線程,可是沒法肯定任務的執行順序
3.全局併發隊列的優先級:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默認(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 後臺
DEMO:
見下一篇。