iOS- dispatch_semaphore和NSOperationQueue併發

併發:同一個時間內運行多個任務。又叫共行性,是指處理多個同時性活動的能力。網絡

並行:是指兩個併發的任務同時發生。併發

併發不必定並行,併發不必定要同時發生。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];

 

打印的結果:

相關文章
相關標籤/搜索