国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS-dispatch_semaphore和NSOperationQueue并發

2019-11-14 20:07:25
字體:
來源:轉載
供稿:網友

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

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

并發不一定并行,并發不一定要同時發生。

 

舉個例子:

有兩個快遞分別要送到目的地,有以下兩種方案:

(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];

 

打印的結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 望奎县| 松溪县| 宁蒗| 昌乐县| 民乐县| 勐海县| 平利县| 许昌市| 高阳县| 陇川县| 赤峰市| 嘉禾县| 奇台县| 固镇县| 普安县| 庆城县| 雷山县| 深圳市| 嘉义市| 名山县| 林芝县| 新野县| 依安县| 武川县| 新泰市| 安乡县| 北川| 西昌市| 丽江市| 牙克石市| 清远市| 平武县| 中卫市| 丰原市| 永善县| 临邑县| 内丘县| 大关县| 泽普县| 明水县| 清流县|