iOS- dispatch_semaphore和NSOperationQueue並發

來源:互聯網
上載者:User

iOS- dispatch_semaphore和NSOperationQueue並發
並發:同一個時間內運行多個任務。又叫共行性,是指處理多個同時性活動的能力。 並行:是指兩個並發的任務同時發生。 並發不一定並行,並發不一定要同時發生。   舉個例子: 有兩個快遞分別要送到目的地,有以下兩種方案: (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];

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.