// // ViewControllerGCD.m // GCD使用 // // Created by 雨軒 on 16/1/25. // Copyright © 2016年 apple. All rights reserved. // #import "ViewControllerGCD.h" @implementation ViewControllerGCD -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"======================同步函數======================"); [self syncToALLQueue]; NSLog(@"======================我是一條可愛的分割線======================"); NSLog(@"======================異步函數======================"); [self asyncToALLQueue]; } //異步函數搭配不一樣的隊列 - (void)asyncToALLQueue{ /****************************************************並行隊列****************************************************/ //方式一:建立一個隊列 /* 第一個參數:隊列的名稱 第二個參數:隊列的類型 DISPATCH_QUEUE_SERIAL 串行隊列(讓任務一個接着一個執行) DISPATCH_QUEUE_CONCURRENT 併發隊列(可讓多個任務併發執行,自動開啓多個線程執行,執行異步函數中才有效果) */ dispatch_queue_t concurrentQueue1 = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT); //方式二:獲取GCD提供的一個全局的並行隊列 /* 第一個參數:IOS8以前表明線程的優先級 / IOS8以後表明的是服務質量 (通常寫0) IO8以前的取值 IOS8以後的取值 * - DISPATCH_QUEUE_PRIORITY_HIGH(2) QOS_CLASS_USER_INTERACTIVE 用戶交互(用戶迫切的執行任務,不要在這種服務質量下作耗時操做) * - DISPATCH_QUEUE_PRIORITY_DEFAULT(0) QOS_CLASS_DEFAULT 默認(重置隊列) * - DISPATCH_QUEUE_PRIORITY_LOW(-2) QOS_CLASS_UTILITY 實用工具(耗時操做放在這裏) * - DISPATCH_QUEUE_PRIORITY_BACKGROUND(-32768) QOS_CLASS_BACKGROUND QOS_CLASS_UNSPECIFIED 用戶須要 QOS_CLASS_USER_INITIATED 沒有設置任務優先級 第二個參數:系統保留的佔位參數,永遠寫0 */ dispatch_queue_t concurrentQueue2 = dispatch_get_global_queue(0, 0); /****************************************************串行隊列****************************************************/ /* 第一個參數:隊列的名稱 第二個參數:隊列的類型 DISPATCH_QUEUE_SERIAL 串行隊列(讓任務一個接着一個執行) DISPATCH_QUEUE_CONCURRENT 併發隊列(可讓多個任務併發執行,自動開啓多個線程執行,執行異步函數中才有效果) */ dispatch_queue_t serialQueue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_SERIAL); /****************************************************主隊列****************************************************/ //調用函數直接獲取 dispatch_queue_t mainQueue = dispatch_get_main_queue(); /****************************************************添加任務****************************************************/ //異步函數 dispatch_async(mainQueue, ^{ NSLog(@"任務1==========%@",[NSThread currentThread]); }); //異步函數 dispatch_async(mainQueue, ^{ NSLog(@"任務2==========%@",[NSThread currentThread]); }); //異步函數 dispatch_async(mainQueue, ^{ NSLog(@"任務3==========%@",[NSThread currentThread]); }); //異步函數 dispatch_async(mainQueue, ^{ NSLog(@"任務4==========%@",[NSThread currentThread]); }); } //同步函數搭配不一樣的隊列 - (void)syncToALLQueue{ /****************************************************並行隊列****************************************************/ //方式一:建立一個隊列 /* 第一個參數:隊列的名稱 第二個參數:隊列的類型 DISPATCH_QUEUE_SERIAL 串行隊列(讓任務一個接着一個執行) DISPATCH_QUEUE_CONCURRENT 併發隊列(可讓多個任務併發執行,自動開啓多個線程執行,執行異步函數中才有效果) */ dispatch_queue_t concurrentQueue1 = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT); //方式二:獲取GCD提供的一個全局的並行隊列 /* 第一個參數:IOS8以前表明線程的優先級 / IOS8以後表明的是服務質量 (通常寫0) IO8以前的取值 IOS8以後的取值 * - DISPATCH_QUEUE_PRIORITY_HIGH(2) QOS_CLASS_USER_INTERACTIVE 用戶交互(用戶迫切的執行任務,不要在這種服務質量下作耗時操做) * - DISPATCH_QUEUE_PRIORITY_DEFAULT(0) QOS_CLASS_DEFAULT 默認(重置隊列) * - DISPATCH_QUEUE_PRIORITY_LOW(-2) QOS_CLASS_UTILITY 實用工具(耗時操做放在這裏) * - DISPATCH_QUEUE_PRIORITY_BACKGROUND(-32768) QOS_CLASS_BACKGROUND QOS_CLASS_UNSPECIFIED 用戶須要 QOS_CLASS_USER_INITIATED 沒有設置任務優先級 第二個參數:系統保留的佔位參數,永遠寫0 */ dispatch_queue_t concurrentQueue2 = dispatch_get_global_queue(0, 0); /****************************************************串行隊列****************************************************/ /* 第一個參數:隊列的名稱 第二個參數:隊列的類型 DISPATCH_QUEUE_SERIAL 串行隊列(讓任務一個接着一個執行) DISPATCH_QUEUE_CONCURRENT 併發隊列(可讓多個任務併發執行,自動開啓多個線程執行,執行異步函數中才有效果) */ dispatch_queue_t serialQueue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_SERIAL); /****************************************************主隊列****************************************************/ //調用函數直接獲取 dispatch_queue_t mainQueue = dispatch_get_main_queue(); /****************************************************添加任務****************************************************/ //異步函數 dispatch_sync(mainQueue, ^{ NSLog(@"任務1==========%@",[NSThread currentThread]); }); //異步函數 dispatch_sync(mainQueue, ^{ NSLog(@"任務2==========%@",[NSThread currentThread]); }); //異步函數 dispatch_sync(mainQueue, ^{ NSLog(@"任務3==========%@",[NSThread currentThread]); }); //異步函數 dispatch_sync(mainQueue, ^{ NSLog(@"任務4==========%@",[NSThread currentThread]); }); } @end
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //把代碼封裝到子線程中執行, 解決同步函數使用主隊列死鎖問題 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"======================同步函數======================"); [self syncToALLQueue]; NSLog(@"======================我是一條可愛的分割線======================"); NSLog(@"======================異步函數======================"); [self asyncToALLQueue]; }); }
GCD實現線程間的通訊很是簡單,直接在函數裏嵌套函數就好了
代碼以下:併發
//線程間的通訊 -(void)threadsCommunicate{ //在子線程中執行耗時操做 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //耗時操做...... //通知主線程,執行操做(好比刷新UI) //這種狀況下使用異步函數或使用同步函數,效果是同樣的都是在主線程中執行,而且當前線程不是主線程,並不會發生死鎖 dispatch_async(dispatch_get_main_queue(), ^{ // 刷新UI }); }); }