ios多線程操作(四)—— GCD核心概念
阿新 • • 發佈:2017-05-04
indent img 操作 fort 16px 2.0 b2c 有一種 read
GCD全稱Grand Central Dispatch。可譯為“大派發中樞調度器”,以純C語言寫成,提供了很多很強大的函數。GCD是蘋果公司為多核的並行運算提出的解決方式,它能夠自己主動利用很多其它的CPU內核來參與運算。會自己主動管理線程的生命周(創建線程、調度任務、銷毀線程)。而程序猿僅僅須要告訴GCD想要運行什麽任務,不須要編寫不論什麽線程管理代碼! GCD中有兩個核心概念,一是任務。二是隊列。 任務:要運行什麽樣的操作。任務都是預先以Block封裝好準備要運行的一段代碼。 隊列:用來存放任務,依照先進先出的方式,調度任務在哪一條線程上運行。 GCD中有兩個用來運行任務的函數,各自是同步函數和異步函數。
同步函數:該函數的代碼形式例如以下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
當中queue為隊列,block為任務
同步任務並不會創建線程,但會在當前線程(能夠是子線程,頁能夠是主線程)中運行。同步任務有一個特性。僅僅要同步任務一加入到隊列中就要立即運行。同步任務不運行完就不會運行往後的代碼。
比如:
執行結果例如以下:
據此能夠驗證同步任務的特性
異步函數: dispatch_async(dispatch_queue_t queue, ^(void)block) 普通情況下異步任務都會開啟一條子線程在後臺運行(有一種情況除外。後面會講到),異步任務的一個特性就是不用等待當前線程的任務就能直接運行 比如:
執行結果例如以下:
第二次執行結果:
能夠看到兩次執行結果不同,且不在同一線程中. 假設將代碼改為例如以下形式:
運行結果例如以下:
由此可得隊列開啟多少條我們無法控制。異步函數並不會等待當前線程(當前線程為主線程)的任務。
GCD全稱Grand Central Dispatch。可譯為“大派發中樞調度器”,以純C語言寫成,提供了很多很強大的函數。GCD是蘋果公司為多核的並行運算提出的解決方式,它能夠自己主動利用很多其它的CPU內核來參與運算。會自己主動管理線程的生命周(創建線程、調度任務、銷毀線程)。而程序猿僅僅須要告訴GCD想要運行什麽任務,不須要編寫不論什麽線程管理代碼! GCD中有兩個核心概念,一是任務。二是隊列。 任務:要運行什麽樣的操作。任務都是預先以Block封裝好準備要運行的一段代碼。 隊列:用來存放任務,依照先進先出的方式,調度任務在哪一條線程上運行。 GCD中有兩個用來運行任務的函數,各自是同步函數和異步函數。
- (void)viewDidLoad { [super viewDidLoad]; // 獲得全局隊列 dispatch_queue_t q = dispatch_get_global_queue(0, 0); // 運行同步任務 dispatch_sync(q, ^{ // 讓運行該任務的線程休眠2s [NSThread sleepForTimeInterval:2.0]; NSLog(@"block - %@",[NSThread currentThread]); }); NSLog(@"viewDidLoad - %@",[NSThread currentThread]); }
執行結果例如以下:
據此能夠驗證同步任務的特性
異步函數: dispatch_async(dispatch_queue_t queue, ^(void)block) 普通情況下異步任務都會開啟一條子線程在後臺運行(有一種情況除外。後面會講到),異步任務的一個特性就是不用等待當前線程的任務就能直接運行 比如:
- (void)viewDidLoad { [super viewDidLoad]; // 獲得全局隊列 dispatch_queue_t q = dispatch_get_global_queue(0, 0); // 運行異步任務 dispatch_async(q, ^{ // for (int i = 0; i<10; i++) { NSLog(@"block - %@ - %d",[NSThread currentThread],i); } }); NSLog(@"viewDidLoad - %@",[NSThread currentThread]); }
執行結果例如以下:
第二次執行結果:
能夠看到兩次執行結果不同,且不在同一線程中. 假設將代碼改為例如以下形式:
- (void)viewDidLoad { [superviewDidLoad]; //獲得全局隊列 dispatch_queue_t q =dispatch_get_global_queue(0, 0); //運行異步任務 for (int i = 0; i< 10; i++) { dispatch_async(q, ^{ NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i); }); } NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]); }
運行結果例如以下:
由此可得隊列開啟多少條我們無法控制。異步函數並不會等待當前線程(當前線程為主線程)的任務。
ios多線程操作(四)—— GCD核心概念