關於——GCD,——GCD
GCD全稱是Grand Central Dispatch,可譯為“牛逼的中樞調度器”,純C語言提供了強大的函數。GCD中2個核心概念任務:執行什麼操作。隊列:用來存放任務。(說白點,任務只有放在隊列中,才能執行。) GCD的只用2個步驟定製任務: 你想要做的事情將任務添加到隊列中: GCD會自動將隊列中的任務取出,放到對應的線程中執行,任務的取出遵循隊列的FIFO原則:先進先出,後進後出。 GCD怎麼執行任務GCD中有2個用來執行任務的函數1、同步的方式執行任務
1 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);2 //queue:隊列3 //block:任務
2、非同步方式執行任務
1 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
同步和非同步區別
同步:在當前線程中執行(不會開啟線程)
非同步:在另一條線程中執行(會開啟線程)
隊列的類型
GCD的隊列可以分為2打類型
1、並發隊列
並發隊列,可以讓多個任務並發(同時)執行 (自動開啟多個線程同時執行任務)
並發功能只有在非同步(dispatch_async)函數下才有有效
GCD預設已經提供了全域的並發隊列,供整個應用使用,不需要手動建立使用dispatch_get_global_queue函數獲得全域的並發隊列
1 dispatch_queue_t dispatch_get_global_queue(2 dispatch_queue_priority_t priority, // 隊列的優先順序3 unsigned long flags); // 此參數暫時無用,用0即可4 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 獲得全域並發隊列
全域並發隊列的優先順序
1 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 預設(中)3 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低4 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 後台
2、串列隊列
讓任務一個接著一個的執行 (一個任務執行完畢後,在執行下一個任務)
GCD中獲得串列有2種途徑
一、使用dispatch_queue_create函數建立串列隊列
1 dispatch_queue_t2 dispatch_queue_create(const char *label, // 隊列名稱 3 dispatch_queue_attr_t attr); // 隊列屬性,一般用NULL即可4 dispatch_queue_t queue = dispatch_queue_create("cn.itcast.queue", NULL); // 建立5 dispatch_release(queue); // 非ARC需要釋放手動建立的隊列
二、使用主隊列(跟主線程相關聯的隊列)
主隊列是GCD內建的一種特殊的串列隊列
放在主隊列中的任務,都會放到主線程中執行
使用dispatch_get_main_queue()獲得主隊列
1 dispatch_queue_t queue = dispatch_get_main_queue();
------簡單總結下------
同步和非同步決定了要不要開啟新的線程
同步:在當前線程中執行任務,不具備開啟新的線程的能力。
非同步:在新的線程中執行任務。具備開啟新的線程的能力。
並發和串列決定了任務的執行方式
並發:多個任務(同時)執行
串列:一個任務執行完畢後,再執行下一個任務。
**線程間的通訊**
子線程返回主線程
1 //建立全域並發隊列 2 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 3 //新增工作到隊列中,執行 4 dispatch_async(queue, ^{ 5 NSLog(@"----111----%@",[NSThread currentThread]); 6 //下載圖片 7 NSURL *url = [NSURL URLWithString:@"http://5.26923.com/download/pic/000/328/ba80a24af0d5aba07e1461eca71f9502.jpg"]; 8 NSData *data = [NSData dataWithContentsOfURL:url]; 9 UIImage *image = [UIImage imageWithData:data];10 //回主線程顯示圖片11 dispatch_async(dispatch_get_main_queue(), ^{12 NSLog(@"------22222----%@",[NSThread currentThread]) ;13 self.image1View.image = image;14 });15 });
**延時執行**
一、調用NSObject的方法
1 [self performSelector:@selector(run) withObject:nil afterDelay:2.0];2 // 2秒後再調用self的run方法
二、使用GCD函數
1 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{2 // 2秒後非同步執行這裡的代碼...3 4 });
**一次性代碼**
使用dispatch_once函數能保證某段代碼在程式運行過程中只被執行1次
1 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{2 NSLog(@"------111------%@",[NSThread currentThread]);3 });
**隊列組**
隊列組適合用於,分別非同步執行2個耗時操作。且等2個非同步作業都執行完畢後,在返回主線程執行操作
1 dispatch_group_t group = dispatch_group_create(); 2 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 3 // 執行1個耗時的非同步作業 4 }); 5 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 6 // 執行1個耗時的非同步作業 7 }); 8 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 9 // 等前面的非同步作業都執行完畢後,回到主線程...10 });
以上是,我個人學習過程中的筆記,如果您發現,不對的地方,或者有更好的方法,請告訴我。以便於我改正。萬分感謝。