国产探花免费观看_亚洲丰满少妇自慰呻吟_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.至此解決了依次執行異步網絡請求 的一種實現方法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肥西县| 大姚县| 庄河市| 威远县| 砀山县| 东乌珠穆沁旗| 武汉市| 红河县| 墨脱县| 桑日县| 若尔盖县| 阳山县| 集贤县| 岳西县| 泾川县| 榆中县| 抚远县| 景泰县| 赫章县| 镇宁| 合肥市| 永新县| 蒙城县| 阳谷县| 西藏| 龙泉市| 新余市| 利辛县| 农安县| 舟山市| 呼伦贝尔市| 舞阳县| 保康县| 鸡东县| 定边县| 邢台市| 福鼎市| 瑞金市| 余干县| 博客| 河北区|