你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS- dispatch_semaphore和NSOperationQueue並發

iOS- dispatch_semaphore和NSOperationQueue並發

編輯:IOS開發綜合
並發:同一個時間內運行多個任務。又叫共行性,是指處理多個同時性活動的能力。   並行:是指兩個並發的任務同時發生。   並發不一定並行,並發不一定要同時發生。       舉個例子:   有兩個快遞分別要送到目的地,有以下兩種方案:   (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];
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved