併發:同一個時間內運行多個任務。又叫共行性,是指處理多個同時性活動的能力。網絡
並行:是指兩個併發的任務同時發生。併發
併發不必定並行,併發不必定要同時發生。async
舉個例子:spa
有兩個快遞分別要送到目的地,有如下兩種方案:線程
(1)一個快遞員分別把兩個快遞送到對應的目的地。(併發)3d
(2)兩個快遞員同時送一個快遞到目的地。(並行)code
在iOS中,常常能夠看見有這樣的需求,就是一個方法要等另一個方法執行完畢再作相對應的處理,好比說一些網絡請求,須要根據上一個請求的返回值作相對應的處理再執行第二個請求,因此咱們不能讓兩個請求同時去請求網絡。下面就記錄如下經過GCD和NSOperationQueue來控制併發。blog
dispatch_semaphore
隊列
信號量是一個整型值而且具備初始計數值,信號量一般支持兩個操做:通知和等待。當信號被通知的時候計數值會增長,當信號量在線程上等待的時候,必要的狀況下線程會被阻塞掉,直至信號被通知時計數值大於0,而後線程會減小這個計數繼續工做。it
GCD中又3個信號量有關的操做:
dispatch_semaphore_create 信號量建立
dispatch_semaphore_signal 發送通知
dispatch_semaphore_wait 信號量等待
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL); dispatch_async(queue, ^{ for (int i = 0 ; i < 100; i++) { NSLog(@"i的值是:%d",i); } dispatch_semaphore_signal(sem); }); dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); for (int j = 0; j < 10; j ++) { NSLog(@"j的值是:%d",j); }
運行結果是:
NSOperationQueue
在不添加依賴的狀況下:
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount = 10; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 1000; i++) { NSLog(@"執行併發隊列1:%d",i); } }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = 0; i < 1500; i++) { NSLog(@"執行併發隊列2:%d",i); } }]; [queue addOperation:operation1]; [queue addOperation:operation2];
運行結果:
兩個NSOperation是併發打印的。
添加依賴控制後:
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount = 10; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 1000; i++) { NSLog(@"執行併發隊列1:%d",i); } }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (int i = 0; i < 1500; i++) { NSLog(@"執行併發隊列2:%d",i); } }]; [operation1 addDependency:operation2]; //添加依賴,operation1要依賴operation2才能繼續執行 [queue addOperation:operation1]; [queue addOperation:operation2];
打印的結果: