一、簡介 1.1 GCD (Grand Central Dispatch )是Apple開發的一個多核編程的解決方法。 Grand 含義是“偉大的、巨集大的”,Central含義“中央的”,Dispatch含義是“分發、派遣,調度”; 1.2 GCD中有2個核心概念 任務:執行什麼操作 隊列:用來存放 ...
一、簡介
1.1 GCD (Grand Central Dispatch )是Apple開發的一個多核編程的解決方法。
Grand 含義是“偉大的、巨集大的”,Central含義“中央的”,Dispatch含義是“分發、派遣,調度”;
1.2 GCD中有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.3 GCD中還有個用來執行任務的函數:
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.1 GCD中獲得串列有2種途徑
使用dispatch_queue_create函數創建串列隊列
創建串列隊列(隊列類型傳遞NULL或者DISPATCH_QUEUE_SERIAL)
dispatch_queue_t queue = dispatch_queue_create("com.520it.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、結果: (通過結果可以看出、有多條線程在執行、並且非同步)