全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解iOS中多个网络请求的同步问题总结

场景描述:我们同时发出了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(@"请求完成");
  });
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ios  # 多个网络请求同步  # 网络请求同步任务  # ios同步网络请求数据  # iOS判断网络请求超时的方法  # iOS中多网络请求的线程安全详解  # iOS当多个网络请求完成后执行下一步的方法详解  # 回调  # 信号量  # 的是  # 第一个  # 第二个  # 解决方法  # 是在  # 很好  # 放在  # 两种  # 遍历  # 这个问题  # 批处理  # 大大的  # 多说  # 来实现  # 塞进  # 开源  # 大家多多  # 有一个 


相关文章: 开源网站制作软件,开源网站什么意思?  C#如何使用XPathNavigator高效查询XML  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  盐城做公司网站,江苏电子版退休证办理流程?  如何在IIS中新建站点并配置端口与物理路径?  如何通过WDCP绑定主域名及创建子域名站点?  建站主机CVM配置优化、SEO策略与性能提升指南  c# 在高并发场景下,委托和接口调用的性能对比  北京专业网站制作设计师招聘,北京白云观官方网站?  定制建站策划方案_专业建站与网站建设方案一站式指南  如何破解联通资金短缺导致的基站建设难题?  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星下载版如何获取与安装?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  代购小票制作网站有哪些,购物小票的简要说明?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  已有域名如何免费搭建网站?  如何快速选择适合个人网站的云服务器配置?  焦点电影公司作品,电影焦点结局是什么?  高端企业智能建站程序:SEO优化与响应式模板定制开发  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何选择高效稳定的ISP建站解决方案?  建站之星后台管理如何实现高效配置?  如何用wdcp快速搭建高效网站?  如何选择适配移动端的WAP自助建站平台?  如何在IIS中配置站点IP、端口及主机头?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  制作网站的软件免费下载,免费制作app哪个平台好?  寿县云建站:智能SEO优化与多行业模板快速上线指南  建站之星安装步骤有哪些常见问题?  C++时间戳转换成日期时间的步骤和示例代码  深圳网站制作培训,深圳哪些招聘网站比较好?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何快速搭建支持数据库操作的智能建站平台?  网站app免费制作软件,能免费看各大网站视频的手机app?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  浅析上传头像示例及其注意事项  网站制作价目表怎么做,珍爱网婚介费用多少?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  大连网站制作公司哪家好一点,大连买房网站哪个好?  宿州网站制作公司兴策,安徽省低保查询网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何通过宝塔面板实现本地网站访问?  ,sp开头的版面叫什么?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站主机与服务器功能差异如何区分? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。