并發:同一個時間內運行多個任務。又叫共行性,是指處理多個同時性活動的能力。
并行:是指兩個并發的任務同時發生。
并發不一定并行,并發不一定要同時發生。
舉個例子:
有兩個快遞分別要送到目的地,有以下兩種方案:
(1)一個快遞員分別把兩個快遞送到對應的目的地。(并發)
(2)兩個快遞員同時送一個快遞到目的地。(并行)
在iOS中,經常可以看見有這樣的需求,就是一個方法要等另外一個方法執行完畢再做相對應的處理,比如說一些網絡請求,需要根據上一個請求的返回值做相對應的處理再執行第二個請求,所以我們不能讓兩個請求同時去請求網絡。下面就記錄以下通過GCD和NSOperationQueue來控制并發。
dispatch_semaphore
信號量是一個整型值并且具有初始計數值,信號量通常支持兩個操作:通知和等待。當信號被通知的時候計數值會增加,當信號量在線程上等待的時候,必要的情況下線程會被阻塞掉,直至信號被通知時計數值大于0,然后線程會減少這個計數繼續工作。
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];
打印的結果:

新聞熱點
疑難解答