1.1GCD (Grand Central Dispatch )是Apple開發的一個多核編程的解決方法。
Grand 含義是“偉大的、宏大的”,Central含義“中央的”,Dispatch含義是“分發、派遣,調度”;
1.2GCD中有2個核心概念
任務:執行什麼操作
隊列:用來存放任務
GCD的使用就2個步驟
1、定制任務 (確定想做的事情)
2、將任務添加到隊列中 (GCD會自動將隊列中的任務取出,放到對應的線程中執行)
任務的取出遵循隊列的FIFO原則:先進先出,後進後出
3、執行任務
GCD中有2個用來執行任務的常用函數
3.1 用同步的方式執行任務
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); (queue:隊列block:任務)
3.2 用異步的方式執行任務
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3.3GCD中還有個用來執行任務的函數:
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
在前面的任務執行結束後它才執行,而且它後面的任務等它執行完成之後才會執行
3.4同步和異步的區別
同步:只能在當前線程中執行任務,不具備開啟新線程的能力
異步:可以在新的線程中執行任務,具備開啟新線程的能力
4、隊列
GCD的隊列可以分為2大類型
4.1並發隊列(Concurrent Dispatch Queue)
可以讓多個任務並發(同時)執行(自動開啟多個線程同時執行任務)
並發功能只有在異步(dispatch_async)函數下才有效
4.2串行隊列(Serial Dispatch Queue)
讓任務一個接著一個地執行(一個任務執行完畢後,再執行下一個任務)
4.3 並發隊列創建
4.3.1使用dispatch_queue_create函數創建隊列
dispatch_queue_t
dispatch_queue_create(const char *label, // 隊列名稱
dispatch_queue_attr_t attr); // 隊列的類型
創建並發隊列
dispatch_queue_t queue = dispatch_queue_create("cc.kyle.2016", DISPATCH_QUEUE_CONCURRENT);
GCD默認已經提供了全局的並發隊列,供整個應用使用,可以無需手動創建
使用dispatch_get_global_queue函數獲得全局的並發隊列
dispatch_queue_t dispatch_get_global_queue(
dispatch_queue_priority_t priority, // 隊列的優先級
unsigned long flags); // 此參數暫時無用,用0即可
4.3.2獲得全局並發隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
4.3.3全局並發隊列的優先級
4.4串行隊列的創建
4.4.1GCD中獲得串行有2種途徑
使用dispatch_queue_create函數創建串行隊列
創建串行隊列(隊列類型傳遞NULL或者DISPATCH_QUEUE_SERIAL)
dispatch_queue_t queue = dispatch_queue_create("com.Kyle.queue", NULL);
使用主隊列(跟主線程相關聯的隊列)
主隊列是GCD自帶的一種特殊的串行隊列
放在主隊列中的任務,都會放到主線程中執行
使用dispatch_get_main_queue()獲得主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
5、各種隊列的執行效果
1、異步+並發 (學習創建多線程的過程)
/** * 異步函數 + 並發隊列:可以同時開啟多條線程 */ - (void)asyncConcurrent { // 1.創建一個並發隊列 // label : 相當於隊列的名字 // dispatch_queue_t queue = dispatch_queue_create("com.kyle.gcd, DISPATCH_QUEUE_CONCURRENT); // 或者
//1.獲得全局的並發隊列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2.將任務加入隊列 dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"one-----%@", [NSThread currentThread]); } }); dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"two-----%@", [NSThread currentThread]); } }); dispatch_async(queue, ^{ for (NSInteger i = 0; i<10; i++) { NSLog(@"three-----%@", [NSThread currentThread]); } }); NSLog(@"asyncConcurrent--------end"); }
2、結果: (通過結果可以看出、有多條線程在執行、並且異步)