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

首頁 > 系統 > iOS > 正文

詳解iOS中多個網絡請求的同步問題總結

2020-07-26 02:49:38
字體:
來源:轉載
供稿:網友

場景描述:我們同時發出了a、b、c 3個網絡請求,我們希望在a、b、c 3個網絡請求都結束的時候獲得一個通知。

常見解決方法:通過度娘目前找到兩種做法;1、通過添加標識來判斷請求是否全部結束 2、dispatch_group + 信號量

本篇文章demo

1、添加標識的解決方法

在遇到這個問題時首先想到了唐巧大大的猿題庫團隊開源的網絡框架YTKNetwork,然后閱讀源碼發現YTKNetwork是通過添加標識來實現網絡請求的批量請求處理;

話不多說直接上代碼在YTKNetwork里負責進行網絡批處理請求的是YTKBatchRequest類,下面看下它的使用示例:

 YTKBatchRequest *batchRequest = [[YTKBatchRequest alloc] initWithRequestArray:@[a, b, c, d]];先調用初始化方法把4個網絡請求的實例塞進去,看下這個初始化方法

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

我們看到有一個_finishedCount的變量根據字面很好理解是用來記錄請求完成的個數,然后我們全局搜下這個變量,發現只有在下面的這個方法中用到了這個變量

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

上述方法是網絡請求結束的回調代理方法,完成后_finishedCount計數加1,然后和保存網絡請求實例的數組元素個數進行比較如果相等說明所有的請求都已經完成,調用回調的代理方法及block請求結束。

然后YTKNetwork對于批量網絡請求失敗的處理是,只要一個失敗就立即停止請求,調用失敗回調:

- (void)requestFailed:(YTKRequest )request {  [self toggleAccessoriesWillStopCallBack];  // Stop  for (YTKRequest req in _requestArray) {//遍歷請求實例數組    [req stop];//停止請求  }  // Callback  //回調  if ([_delegate respondsToSelector:@selector(batchRequestFailed:)]) {    [_delegate batchRequestFailed:self];  }  if (_failureCompletionBlock) {    _failureCompletionBlock(self);  }  // Clear  [self clearCompletionBlock];  [self toggleAccessoriesDidStopCallBack];  [[YTKBatchRequestAgent sharedInstance] removeBatchRequest:self];}

總結:YTKNetwork的做法大致就是用一個變量記錄完成請求的個數,然后在單個網絡請求結束回調的時候判斷當前完成的網絡請求個數是否和總的網絡請求個數相等,如果相等則說明請求結束。

2、dispatch_group + 信號量

參考文章采用的是group + 信號量,下面示例采用dispatch_group_enter、dispatch_group_leave實現詳見 本篇文章demo。

- (void)loadRequest1{  dispatch_group_t dispatchGroup = dispatch_group_create();  dispatch_group_enter(dispatchGroup);  [MALAFNManger getDataWithUrl:Url1 parameters:nil finish:^(RequestResult result) {    NSLog(@"第一個請求完成");    dispatch_group_leave(dispatchGroup);  } des:@"第一個url"];  dispatch_group_enter(dispatchGroup);  [MALAFNManger getDataWithUrl:Url2 parameters:nil finish:^(RequestResult result) {    dispatch_async(dispatch_get_global_queue(0, 0), ^{      sleep(10);//網絡請求結束后回調是在主線程如果sleep放在外面會阻塞主線程      NSLog(@"第二個請求完成");      dispatch_group_leave(dispatchGroup);    });  } des:@"第二個url"];  dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){    NSLog(@"請求完成");  });}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 聂荣县| 黑山县| 太和县| 米林县| 乳源| 子洲县| 呼图壁县| 黄山市| 繁昌县| 龙里县| 望都县| 万安县| 遵义市| 闻喜县| 新郑市| 康定县| 永靖县| 延津县| 吉安县| 抚州市| 乐至县| 丰顺县| 许昌县| 贡觉县| 兖州市| 达州市| 屯昌县| 浦东新区| 达尔| 安远县| 历史| 社旗县| 清镇市| 临夏市| 佳木斯市| 靖宇县| 司法| 马山县| 柳河县| 龙门县| 黔南|