iOS之GCD的局部解析

一什麼是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:

見下一篇。

相關文章
相關標籤/搜索