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

首頁 > 系統 > iOS > 正文

iOS 依次執行 異步網絡請求的一種實現

2019-11-08 00:05:30
字體:
來源:轉載
供稿:網友

1.首先先介紹一個概念dispatch_semaphore


dispatch_semaphore信號量為基于計數器的一種多線程同步機制。用于解決在多個線程訪問共有資源時候,會因為多線程的特性而引發數據出錯的問題.如果semaphore計數大于等于1,計數-1,返回,程序繼續運行。如果計數為0,則等待。dispatch_semaphore_signal(semaphore)為計數+1操作。dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)為設置等待時間,這里設置的等待時間是一直等待。我們可以通俗的理解為單柜臺排隊點餐,計數默認為0,每當有顧客點餐,計數+1,點餐結束-1歸零繼續等待下一位顧客。比較類似于NSLock。

2.主要是介紹使用dispatch_semaphore和NSOperationQueue結合實現依次執行異步請求


NSOperationQueue中裝有任務,設置任務之間相互依賴NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ [self request:@”A”]; }];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ [self request:@"B"];}];NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{ [self request:@”C”]; }];[operation2 addDependency:operation1]; //任務二依賴任務一 [operation3 addDependency:operation2]; //任務三依賴任務二將任務加入隊列中NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO]; 測試執行順序并非是按照A-B-C依賴執行,并且無法得知何時任務執行完畢,進行下一步操作.下面解決這兩個問題

3.解決如何依次執行.就要用到開頭介紹的:dispatch_semaphore來限制是否執行

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //默認創建的信號為0[[NetworkManager shared] RequestWithMethod:HttpMethod_POST Url:strURL params:params success:^(NSURLsessionDataTask *task, id responSEObject) { NSLog(@"%@",index); dispatch_semaphore_signal(semaphore); //這里請求成功信號量 +1 為1} failure:^(NSURLSessionDataTask *task, NSError *error) { dispatch_semaphore_signal(semaphore); //這里請求失敗信號量 +1 為1}];dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //走到這里如果信號量為0 則不再執行下面的代碼 一直等待 信號量不是0 出現 才會執行下面代碼,然后信號量為 - 1這個解決了依次執行的問題 下面解決怎么知道全部執行完畢呢

4. 執行完畢問題的解決,使用KVO監聽任務數是否為0

//添加監聽 監聽隊列是否全部執行完畢[queue addObserver:self forKeyPath:@"operationCount" options:0 context:nil];-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {if ([keyPath isEqualToString:@"operationCount"]) { NSOperationQueue *queue = (NSOperationQueue *)object; if (queue.operationCount == 0) { NSLog(@"全部完成"); }}}

5.至此解決了依次執行異步網絡請求 的一種實現方法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 崇仁县| 余庆县| 江华| 德阳市| 乐东| 东宁县| 樟树市| 宣威市| 文成县| 登封市| 通山县| 荥经县| 邵东县| 太仓市| 泽库县| 信宜市| 阜南县| 南和县| 昌图县| 尖扎县| 云南省| 鄯善县| 安吉县| 来安县| 台州市| 兴隆县| 古浪县| 英吉沙县| 江阴市| 青阳县| 舒城县| 金塔县| 浮梁县| 孟连| 贞丰县| 响水县| 洛宁县| 玉环县| 玉环县| 肥乡县| 赤城县|