iOS多線程之GCD

1.簡介 

什麼是GCD
  •  全稱是Grand Central Dispatch,可譯爲「牛逼的中樞調度器」程序員

  •  純C語言,提供了很是多強大的函數併發

GCD的優點
  •  GCD是蘋果公司爲多核的並行運算提出的解決方案異步

  •  GCD會自動利用更多的CPU內核(好比雙核、四核)async

  •  GCD會自動管理線程的生命週期(建立線程、調度任務、銷燬線程)函數

  •  程序員只須要告訴GCD想要執行什麼任務,不須要編寫任何線程管理代碼spa

2.任務和隊列

GCD有兩個核心概念
  •  任務:執行什麼操做線程

  •  隊列:用來存聽任務code

GCD的使用有兩個步驟
定製任務

肯定想作的事情
生命週期

將任務添加到隊列中
  • GCD會自動將隊列中的任務取出,放到對應的線程中執行隊列

  •  任務的取出遵循隊列的FIFO原則:先進先出,後進後出

3.執行任務

  •  GCD中有2個用來執行任務的函數

 用同步的方式執行任務 
 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
 queue:隊列 
 block:任務 
 
 用異步的方式執行任務
 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
  •  同步和異步的區別

  同步:在當前線程中執行 
  異步:在另外一條線程中執行

4.隊列的類型

併發隊列
  •  可讓多個任務併發(同時)執行(自動開啓多個線程同時執行任務)

  •  併發功能只有在異步(dispatch_async)函數下才有效

串行隊列
  •  讓任務一個接着一個地執行(一個任務執行完畢後,再執行下一個任務)

5.容易混淆的術語

同步和異步決定要不要開啓新的線程
  •  同步:在當前線程中執行任務,不具有開啓新線程的能力

  •  異步:在新的線程中執行任務,具有開啓新線程的能力

併發和串行決定了任務的執行方式
  •  併發:多個任務併發(同時)執行

  •  串行:一個任務執行完畢後,再執行下一個任務

6.併發隊列

  •  GCD默認已經提供了全局的併發隊列,供整個應用使用,不須要手動建立

使用dispatch_get_global_queue函數得到全局的併發隊列 
  dispatch_queue_t dispatch_get_global_queue(
  dispatch_queue_priority_t priority, // 隊列的優先級
  unsigned long flags); // 此參數暫時無用,用0便可
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 得到全局併發隊列
  •  全局併發隊列的優先級

  #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 // 後臺

7.串行隊列

  •  使用dispatch_queue_create函數建立串行隊列

dispatch_queue_t
dispatch_queue_create(const char *label, // 隊列名稱 
dispatch_queue_attr_t attr); // 隊列屬性,通常用NULL便可
dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 建立
dispatch_release(queue); // 非ARC須要釋放手動建立的隊列
  •  使用主隊列(跟主線程相關聯的隊列)

  主隊列是GCD自帶的一種特殊的串行隊列 
  放在主隊列中的任務,都會放到主線程中執行 
  使用dispatch_get_main_queue()得到主隊列 dispatch_queue_t queue = dispatch_get_main_queue();

8.各類隊列的執行效果


全局併發隊列 手動建立串行隊列
主隊列

同步(sync)

  •  沒有開啓新線程

  • 串行執行任務

  •  沒有開啓新線程

  •  串行執行任務

  •  沒有開啓新線程

  •  串行執行任務

異步(async)

  •  有開啓新線程

  •  併發執行任務

  •  有開啓新線程

  •  串行執行任務

  •  沒有開啓新線程

  •  串行執行任務

9.線程間通訊示例

  從子線程回到主線程 
  dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執行耗時的異步操做...
      dispatch_async(dispatch_get_main_queue(), ^{
        // 回到主線程,執行UI刷新操做
        });
});
相關文章
相關標籤/搜索