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

首頁 > 系統(tǒng) > iOS > 正文

詳解iOS中多個(gè)網(wǎng)絡(luò)請(qǐng)求的同步問題總結(jié)

2019-10-21 18:46:39
字體:
供稿:網(wǎ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í)來判斷請(qǐng)求是否全部結(jié)束 2、dispatch_group + 信號(hào)量

本篇文章demo

1、添加標(biāo)識(shí)的解決方法

在遇到這個(gè)問題時(shí)首先想到了唐巧大大的猿題庫團(tuán)隊(duì)開源的網(wǎng)絡(luò)框架YTKNetwork,然后閱讀源碼發(fā)現(xiàn)YTKNetwork是通過添加標(biāo)識(shí)來實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的批量請(qǐng)求處理;

話不多說直接上代碼在YTKNetwork里負(fù)責(zé)進(jìn)行網(wǎng)絡(luò)批處理請(qǐng)求的是YTKBatchRequest類,下面看下它的使用示例:

ios,多個(gè)網(wǎng)絡(luò)請(qǐng)求同步,網(wǎng)絡(luò)請(qǐng)求同步任務(wù),ios同步網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)

 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ù)字面很好理解是用來記錄請(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)求完成");  });}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 奉新县| 藁城市| 舟山市| 北辰区| 紫阳县| 黄平县| 安远县| 绥棱县| 江都市| 河源市| 汨罗市| 永兴县| 荆州市| 正阳县| 辽中县| 通州区| 松桃| 铜川市| 合山市| 榆社县| 定边县| 顺昌县| 东城区| 公主岭市| 神木县| 汾阳市| 洪泽县| 奉新县| 景洪市| 云林县| 闸北区| 昆山市| 松江区| 呼和浩特市| 若羌县| 施秉县| 宜黄县| 垫江县| 淳安县| 茂名市| 富宁县|