您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“iOS中如何實(shí)現(xiàn)多個(gè)網(wǎng)絡(luò)請(qǐng)求的同步”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“iOS中如何實(shí)現(xiàn)多個(gè)網(wǎng)絡(luò)請(qǐng)求的同步”這篇文章吧。
場(chǎng)景描述:我們同時(shí)發(fā)出了a、b、c 3個(gè)網(wǎng)絡(luò)請(qǐng)求,我們希望在a、b、c 3個(gè)網(wǎng)絡(luò)請(qǐng)求都結(jié)束的時(shí)候獲得一個(gè)通知。
常見解決方法:通過度娘目前找到兩種做法;1、通過添加標(biāo)識(shí)來(lái)判斷請(qǐng)求是否全部結(jié)束 2、dispatch_group + 信號(hào)量
1、添加標(biāo)識(shí)的解決方法
在遇到這個(gè)問題時(shí)首先想到了唐巧大大的猿題庫(kù)團(tuán)隊(duì)開源的網(wǎng)絡(luò)框架YTKNetwork,然后閱讀源碼發(fā)現(xiàn)YTKNetwork是通過添加標(biāo)識(shí)來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的批量請(qǐng)求處理;
話不多說直接上代碼在YTKNetwork里負(fù)責(zé)進(jìn)行網(wǎng)絡(luò)批處理請(qǐng)求的是YTKBatchRequest類,下面看下它的使用示例:
YTKBatchRequest *batchRequest = [[YTKBatchRequest alloc] initWithRequestArray:@[a, b, c, d]];
先調(diào)用初始化方法把4個(gè)網(wǎng)絡(luò)請(qǐng)求的實(shí)例塞進(jìn)去,看下這個(gè)初始化方法
- (id)initWithRequestArray:(NSArray )requestArray { self = [super init]; if (self) { _requestArray = [requestArray copy]; _finishedCount = 0; for (YTKRequest req in _requestArray) { if (![req isKindOfClass:[YTKRequest class]]) { YTKLog(@"Error, request item must be YTKRequest instance."); return nil; } } } return self; }
我們看到有一個(gè)_finishedCount的變量根據(jù)字面很好理解是用來(lái)記錄請(qǐng)求完成的個(gè)數(shù),然后我們?nèi)炙严逻@個(gè)變量,發(fā)現(xiàn)只有在下面的這個(gè)方法中用到了這個(gè)變量
- (void)requestFinished:(YTKRequest *)request { _finishedCount++; if (_finishedCount == _requestArray.count) { [self toggleAccessoriesWillStopCallBack]; if ([_delegate respondsToSelector:@selector(batchRequestFinished:)]) { [_delegate batchRequestFinished:self]; } if (_successCompletionBlock) { _successCompletionBlock(self); } [self clearCompletionBlock]; [self toggleAccessoriesDidStopCallBack]; [[YTKBatchRequestAgent sharedInstance] removeBatchRequest:self]; } }
上述方法是網(wǎng)絡(luò)請(qǐng)求結(jié)束的回調(diào)代理方法,完成后_finishedCount計(jì)數(shù)加1,然后和保存網(wǎng)絡(luò)請(qǐng)求實(shí)例的數(shù)組元素個(gè)數(shù)進(jìn)行比較如果相等說明所有的請(qǐng)求都已經(jīng)完成,調(diào)用回調(diào)的代理方法及block請(qǐng)求結(jié)束。
然后YTKNetwork對(duì)于批量網(wǎng)絡(luò)請(qǐng)求失敗的處理是,只要一個(gè)失敗就立即停止請(qǐng)求,調(diào)用失敗回調(diào):
- (void)requestFailed:(YTKRequest )request { [self toggleAccessoriesWillStopCallBack]; // Stop for (YTKRequest req in _requestArray) {//遍歷請(qǐng)求實(shí)例數(shù)組 [req stop];//停止請(qǐng)求 } // Callback //回調(diào) if ([_delegate respondsToSelector:@selector(batchRequestFailed:)]) { [_delegate batchRequestFailed:self]; } if (_failureCompletionBlock) { _failureCompletionBlock(self); } // Clear [self clearCompletionBlock]; [self toggleAccessoriesDidStopCallBack]; [[YTKBatchRequestAgent sharedInstance] removeBatchRequest:self]; }
總結(jié):YTKNetwork的做法大致就是用一個(gè)變量記錄完成請(qǐng)求的個(gè)數(shù),然后在單個(gè)網(wǎng)絡(luò)請(qǐng)求結(jié)束回調(diào)的時(shí)候判斷當(dāng)前完成的網(wǎng)絡(luò)請(qǐng)求個(gè)數(shù)是否和總的網(wǎng)絡(luò)請(qǐng)求個(gè)數(shù)相等,如果相等則說明請(qǐng)求結(jié)束。
2、dispatch_group + 信號(hào)量
參考文章采用的是group + 信號(hào)量,下面示例采用dispatch_group_enter、dispatch_group_leave實(shí)現(xiàn)詳見 本篇文章demo。
- (void)loadRequest1 { dispatch_group_t dispatchGroup = dispatch_group_create(); dispatch_group_enter(dispatchGroup); [MALAFNManger getDataWithUrl:Url1 parameters:nil finish:^(RequestResult result) { NSLog(@"第一個(gè)請(qǐng)求完成"); dispatch_group_leave(dispatchGroup); } des:@"第一個(gè)url"]; dispatch_group_enter(dispatchGroup); [MALAFNManger getDataWithUrl:Url2 parameters:nil finish:^(RequestResult result) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ sleep(10);//網(wǎng)絡(luò)請(qǐng)求結(jié)束后回調(diào)是在主線程如果sleep放在外面會(huì)阻塞主線程 NSLog(@"第二個(gè)請(qǐng)求完成"); dispatch_group_leave(dispatchGroup); }); } des:@"第二個(gè)url"]; dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){ NSLog(@"請(qǐng)求完成"); }); }
以上是“iOS中如何實(shí)現(xiàn)多個(gè)網(wǎng)絡(luò)請(qǐng)求的同步”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。