IOS-GCD運用詳解
前言
對初學者來說,GCD似乎是一道邁不過來的坎,很多人在同步、異步、串行、並行和死鎖這幾個名詞的漩渦中漸漸保持醫治。本文將運用圖文表並茂的方式給大家抽象地解釋其中的原理和規律。
線程、義務和隊列的概念
異步、同步 & 並行、串行的特點
一條重要的原則
普通來說,我們運用GCD的最大目的是在新的線程中同時執行多個義務,這意味著我們需求兩項條件:
能開啟新的線程
義務可以同時執行
結合以上兩個條件,也就等價“開啟新線程的才能 + 義務同步執行的權益”,只要在滿足才能與權益這兩個條件的前提下,我們才可以在同時執行多個義務。
一切組合的特點
(一)異步執行 + 並行隊列
完成代碼:
//異步執行 + 並行隊列 - (void)asyncConcurrent{ //創立一個並行隊列 dispatch_queue_t queue = dispatch_queue_create("標識符", DISPATCH_QUEUE_CONCURRENT); NSLog(@"---start---"); //運用異步函數封裝三個義務 dispatch_async(queue, ^{ NSLog(@"義務1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"義務2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"義務3---%@", [NSThread currentThread]); }); NSLog(@"---end---"); }
打印後果:
(二)異步執行 + 串行隊列
完成代碼:
//異步執行 + 串行隊列 - (void)asyncSerial{ //創立一個串行隊列 dispatch_queue_t queue = dispatch_queue_create("標識符", DISPATCH_QUEUE_SERIAL); NSLog(@"---start---"); //運用異步函數封裝三個義務 dispatch_async(queue, ^{ NSLog(@"義務1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"義務2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"義務3---%@", [NSThread currentThread]); }); NSLog(@"---end---"); }
打印後果:
(三)同步執行 + 並行隊列
完成代碼:
//同步執行 + 並行隊列 - (void)syncConcurrent{ //創立一個並行隊列 dispatch_queue_t queue = dispatch_queue_create("標識符", DISPATCH_QUEUE_CONCURRENT); NSLog(@"---start---"); //運用同步函數封裝三個義務 dispatch_sync(queue, ^{ NSLog(@"義務1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務3---%@", [NSThread currentThread]); }); NSLog(@"---end---"); }
打印後果:
(四)同步執行+ 串行隊列
完成代碼:
- (void)syncSerial{ //創立一個串行隊列 dispatch_queue_t queue = dispatch_queue_create("標識符", DISPATCH_QUEUE_SERIAL); NSLog(@"---start---"); //運用異步函數封裝三個義務 dispatch_sync(queue, ^{ NSLog(@"義務1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務3---%@", [NSThread currentThread]); }); NSLog(@"---end---"); }
打印後果:
(六)同步執行+客隊列(死鎖)
完成代碼:
- (void)syncMain{ //獲取客隊列 dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@"---start---"); //運用同步函數封裝三個義務 dispatch_sync(queue, ^{ NSLog(@"義務1---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務2---%@", [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog(@"義務3---%@", [NSThread currentThread]); }); NSLog(@"---end---"); }
打印後果:
寫在開頭的話
以上就是我對GCD的根底知識和幾種組合的了解。
【iOS-GCD運用詳解及實例解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!