91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS中如何實現多個網絡請求的同步

發布時間:2021-08-04 12:27:34 來源:億速云 閱讀:196 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“iOS中如何實現多個網絡請求的同步”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“iOS中如何實現多個網絡請求的同步”這篇文章吧。

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

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

1、添加標識的解決方法

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

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

iOS中如何實現多個網絡請求的同步

 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(@"請求完成");
  });
}

以上是“iOS中如何實現多個網絡請求的同步”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

乳源| 连平县| 湄潭县| 化德县| 黑山县| 普兰县| 淅川县| 廊坊市| 涡阳县| 肇庆市| 宣化县| 姜堰市| 道孚县| 民乐县| 长治县| 石家庄市| 明光市| 辽宁省| 寻乌县| 万全县| 静海县| 哈巴河县| 丘北县| 汕尾市| 沧州市| 民县| 永安市| 博爱县| 聊城市| 体育| 原阳县| 辽宁省| 喜德县| 静乐县| 广饶县| 巧家县| 印江| 宁陵县| 通许县| 新龙县| 兴海县|