最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年05月03日 10:47:17   作者:liang1991  
這篇文章主要介紹了詳解iOS中多個網(wǎng)絡請求的同步問題總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

本篇文章demo

1、添加標識的解決方法

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

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

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

- (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的變量根據(jù)字面很好理解是用來記錄請求完成的個數(shù),然后我們?nèi)炙严逻@個變量,發(fā)現(xiàn)只有在下面的這個方法中用到了這個變量

- (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)絡請求結(jié)束的回調(diào)代理方法,完成后_finishedCount計數(shù)加1,然后和保存網(wǎng)絡請求實例的數(shù)組元素個數(shù)進行比較如果相等說明所有的請求都已經(jīng)完成,調(diào)用回調(diào)的代理方法及block請求結(jié)束。

然后YTKNetwork對于批量網(wǎng)絡請求失敗的處理是,只要一個失敗就立即停止請求,調(diào)用失敗回調(diào):

- (void)requestFailed:(YTKRequest )request {
  [self toggleAccessoriesWillStopCallBack];
  // Stop
  for (YTKRequest req in _requestArray) {//遍歷請求實例數(shù)組
    [req stop];//停止請求
  }
  // 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的做法大致就是用一個變量記錄完成請求的個數(shù),然后在單個網(wǎng)絡請求結(jié)束回調(diào)的時候判斷當前完成的網(wǎng)絡請求個數(shù)是否和總的網(wǎng)絡請求個數(shù)相等,如果相等則說明請求結(jié)束。

2、dispatch_group + 信號量

參考文章采用的是group + 信號量,下面示例采用dispatch_group_enter、dispatch_group_leave實現(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(@"第一個請求完成");
    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);//網(wǎng)絡請求結(jié)束后回調(diào)是在主線程如果sleep放在外面會阻塞主線程
      NSLog(@"第二個請求完成");
      dispatch_group_leave(dispatchGroup);
    });
  } des:@"第二個url"];
  dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
    NSLog(@"請求完成");
  });
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS中你需要的彈窗效果總結(jié)大全

    iOS中你需要的彈窗效果總結(jié)大全

    彈窗是app中常見控件之一,一般由于項目需求,我們很少能直接使用系統(tǒng)提供的彈窗,這個時候就需要我們根據(jù)產(chǎn)品需求封裝自定義彈窗了。下面這篇文章主要給大家介紹了關(guān)于iOS中你需要的彈窗效果的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • 簡單說說iOS之WKWebView的用法小結(jié)

    簡單說說iOS之WKWebView的用法小結(jié)

    iOS8.0之后我們使用 WebKit框架中的WKWebView來加載網(wǎng)頁。這篇文章主要介紹了簡單說說iOS之WKWebView的用法小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • iOS開發(fā)之UITableView與UISearchController實現(xiàn)搜索及上拉加載,下拉刷新實例代碼

    iOS開發(fā)之UITableView與UISearchController實現(xiàn)搜索及上拉加載,下拉刷新實例代碼

    這篇文章主要介紹了iOS開發(fā)之UITableView與UISearchController實現(xiàn)搜索及上拉加載,下拉刷新實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • iOS實現(xiàn)容器視圖控制器的方法

    iOS實現(xiàn)容器視圖控制器的方法

    本篇文章給大家詳細講述了iOS實現(xiàn)容器視圖控制器的方法,對此感興趣的朋友可以測試學習下。
    2018-02-02
  • iOS 設(shè)置UILabel的行間距并自適應高度的方法

    iOS 設(shè)置UILabel的行間距并自適應高度的方法

    下面小編就為大家?guī)硪黄猧OS 設(shè)置UILabel的行間距并自適應高度的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解iOS獲取通訊錄的4種方式

    詳解iOS獲取通訊錄的4種方式

    這篇文章主要為大家詳細介紹了iOS獲取通訊錄的4種方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Xcode中代碼注釋編寫的一些小技巧

    Xcode中代碼注釋編寫的一些小技巧

    如何在 Xcode 中編寫規(guī)范注釋,規(guī)范注釋可以在Xcode的快速幫助檢查器(quickheliector)中顯示,這篇文章主要給大家介紹了關(guān)于Xcode中代碼注釋編寫的一些小技巧,需要的朋友可以參考下
    2021-10-10
  • iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置

    iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置

    這篇文章主要介紹了iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置,對初學者具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • iOS開發(fā)中class和#import的區(qū)別介紹

    iOS開發(fā)中class和#import的區(qū)別介紹

    這篇文章主要介紹了iOS開發(fā)中class和#import的區(qū)別,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-02-02
  • iOS實現(xiàn)簡易鐘表

    iOS實現(xiàn)簡易鐘表

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)簡易鐘表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

红安县| 新巴尔虎右旗| 略阳县| 行唐县| 南丹县| 广宗县| 九江市| 邛崃市| 剑河县| 陇南市| 武功县| 时尚| 景泰县| 澎湖县| 太谷县| 库尔勒市| 家居| 太和县| 公安县| 尚义县| 西宁市| 黔南| 安塞县| 安丘市| 井冈山市| 家居| 进贤县| 黄大仙区| 九龙县| 前郭尔| 灌阳县| 白城市| 嘉峪关市| 周宁县| 崇仁县| 青龙| 锡林浩特市| 介休市| 张家港市| 南川市| 方正县|