iOS for循环请求 之 使用GCD的dispatch_group_t

业务如下有个数组里面装着许多产品ID,需要拿着产品ID去请求接口,该接口根据该产品ID来判断该产品是否可以上线,但该接口只能接受一个产品ID的传参,不接受多个产品ID的传参,所以只能是遍历产品ID数组,通过for循环一个一个的去请求,通过收到接口的反馈将能上线的产品ID装到一个数组里面,不能上线的产品直接剔除,最后将能上线的产品展示出来


//请求数据
- (void)requestData
{

//117 查询持仓。48091查询普通是否可担保 60 查询价格
__weak typeof(self) weakSelf = self;
NSMutableDictionary *mdicSendValue = [NSMutableDictionary dictionary];
NSMutableArray *ayStockData = [NSMutableArray array];
NSMutableArray *ayStockType = [NSMutableArray array];
NSMutableArray *ayRegx = [NSMutableArray array];
[mdicSendValue setTztValue:@"0" forKey:@"StartPos"];
[mdicSendValue setTztValue:@"1000" forKey:@"Maxcount"];
[mdicSendValue setTztObject:@"1" forKey:@"reqlinktype"];
[mdicSendValue setTztObject:@"0" forKey:@"tokentype"];
[[self requestHandle]requestWithSession:ZTRequestSessionJY AndSendValue:mdicSendValue action:@"117" successNo:-1 success:^(id dicResult, int nAction, NSDictionary *dicSendValue) {
    

    //取可用资产信息
    NSArray *ayAccount = [dicResult tztObjectForKey:@"GRID2"];
        if(ayAccount.count>=2)
        {
             NSArray *aySpear = [ayAccount objectAtIndex:1];
      //                 NSArray *aySpear =  [strTemp componentsSeparatedByString:@","];
                  _headerView.tfAssetsValue.text = [aySpear objectAtIndex:2];
        }
    
    //取持仓信息
    NSArray *ayGRID0Data = [dicResult tztObjectForKey:@"GRID0"];
    NSMutableString *strCode =[NSMutableString string];

    首先创建一个dispatch_group_t
    dispatch_group_t downloadGroup = dispatch_group_create();
    if(ayGRID0Data.count>=2)
    {
       
        for (int i = 1; i < ayGRID0Data.count; i++)
        {
            每次网络请求前先dispatch_group_enter
            dispatch_group_enter(downloadGroup);
            NSString *strTemp = [ayGRID0Data objectAtIndex:i];
            NSArray *aySpear =  [strTemp componentsSeparatedByString:@"|"];
            ZTCalculationModel *model =  [[ZTCalculationModel alloc]init];
        
            model.codeValue = [aySpear objectAtIndex:1];        //遍历获取股票代码
            model.num = [aySpear objectAtIndex:15];        //遍历获取可用数量
            [self.arrList addObject:model];
        
            NSString *strACCOUNTTYPE = [aySpear objectAtIndex:23];
        
            if (strACCOUNTTYPE.length<=0)
            {
                strACCOUNTTYPE = @"SZACCOUNT";
            }
            NSString *sCode = [aySpear objectAtIndex:1];
        
            if (sCode.length<=0)
            {
                sCode = @"";
            }
        
            NSMutableDictionary *dicSend = [NSMutableDictionary dictionary];
            NSString *strToken = [[tztUserData getShareClass] getAccountTokenOfKind:0 tokenIndex:1];
            if(strToken)
                [dicSend setTztValue:strToken forKey:@"Token"];
            else
                [dicSend setTztValue:@"" forKey:@"Token"];
        
            [dicSend setTztValue:sCode forKey:@"STOCKCODE"];
            [dicSend setTztValue:strACCOUNTTYPE forKey:@"WTACCOUNTTYPE"];
            [[self requestHandle]requestWithSession:ZTRequestSessionJY AndSendValue:dicSend action:@"48901" successNo:-1 success:^(id dicResult, int nAction, NSDictionary *dicSendValue) {
            
                NSArray *ayData = [dicResult tztObjectForKey:@"GRID0"];
                请求回调后再dispatch_group_leave,
                dispatch_group_leave(downloadGroup);
            //取可以担保信息
                if(ayData.count>=2)
                {
                    NSString *strTemp = [ayData objectAtIndex:1];
                    NSArray *aySpear =  [strTemp componentsSeparatedByString:@"|"];
                
                //遍历获取折算率 当股票代码和持仓代码一样 和拼接请求价格股票代码
                    [self.arrList enumerateObjectsUsingBlock:^(ZTCalculationModel *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                        if ([obj.codeValue isEqualToString:[aySpear objectAtIndex:1]])
                        {
                            [strCode appendFormat:@"%@|0,",[aySpear objectAtIndex:1]];
                            obj.rate = [aySpear objectAtIndex:3];

                        }
                    
                    }];
        
                
                }

            } failure:^(int nErrNo, NSString *strErrMsg, int nAction, NSDictionary *dicSendValue, id dicResult) {
                    请求回调后再dispatch_group_leave,
                    dispatch_group_leave(downloadGroup);
            }];

        }
    }
    dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
       

      NSMutableDictionary *dicSend = [NSMutableDictionary dictionary];
      [dicSend setTztObject:@"9" forKey:@"AccountIndex"];
      [dicSend setTztObject:@"0" forKey:@"DeviceType"];
      [dicSend setTztObject:@"1" forKey:@"Direction"];
      [dicSend setTztObject:@"0" forKey:@"NewMarketNo"];
      [dicSend setTztObject:@"1" forKey:@"Lead"];
      [dicSend setTztValue:@"0" forKey:@"StartPos"];
      [dicSend setTztObject:@"1" forKey:@"StockIndex"];
      [dicSend setTztValue:@"100" forKey:@"MaxCount"];
      [dicSend setTztObject:strCode forKey:@"Grid"];
      
      
      [[self requestHandle]requestWithSession:ZTRequestSessionHQ AndSendValue:dicSend action:@"60" successNo:-1 originResponse:YES success:^(id dicResult, int nAction, NSDictionary *dicSendValue) {
          
          [self GetHQRecevData:dicResult returnStocks_:ayStockData andStockTypes_:ayStockType];
          
          [ayStockData enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
              
              [self.arrList enumerateObjectsUsingBlock:^(ZTCalculationModel *model, NSUInteger idx, BOOL * _Nonnull stop) {
                  //遍历获取股票名字和股票代码拼接 股票价格 标记是否该股票 当股票代码和持仓代码一样
                  if ([model.codeValue isEqualToString:[[obj objectForKey:@"Code"]objectForKey:@"value"]])
                  {
                      model.codeValue = [NSString stringWithFormat:@"%@(%@)",[[obj objectForKey:@"Name"]objectForKey:@"value"],[[obj objectForKey:@"Code"]objectForKey:@"value"]];
                      model.price = [[obj objectForKey:@"NewPrice"]objectForKey:@"value"];
                      model.b_TPType = YES;
                  }
                  
              }];
              
              
              
          }];
          
          //遍历当标记为yes时那么就是我们要显示的数据保存起来 然后赋值给数据源
          [self.arrList enumerateObjectsUsingBlock:^(ZTCalculationModel *obj, NSUInteger idx, BOOL * _Nonnull stop) {
              
              if (obj.b_TPType == YES)
              {
                  [ayRegx addObject:obj];
              }
              
          }];
          [self.arrList removeAllObjects];
          [self.arrList addObjectsFromArray:ayRegx];
          
          if (self.arrList.count>=3)
          {
              weakSelf.footerView.strMoreTitle = @"加载更多";
              weakSelf.arrMark = 3;
              
          }
          else
          {
              weakSelf.footerView.strMoreTitle = @"添加担保证劵";
              weakSelf.arrMark = self.arrList.count;
              
          }
          weakSelf.footerView.frameHeight = [_footerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
          _tbMain.tableFooterView = _footerView;
          [self.tbMain reloadData];
          
      } failure:^(int nErrNo, NSString *strErrMsg, int nAction, NSDictionary *dicSendValue, id dicResult) {
          
      }];
  });

} failure:^(int nErrNo, NSString *strErrMsg, int nAction, NSDictionary *dicSendValue, id dicResult) {
    
}];

}

代码中我们只添加了4行代码
dispatch_group_t downloadGroup = dispatch_group_create();
dispatch_group_enter(downloadGroup);
dispatch_group_leave(downloadGroup);
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
});
对以上4行代码可理解为:创建一个dispatch_group_t, 每次网络请  求前先dispatch_group_enter,请求回调后再dispatch_group_leave,对于enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在。当所有enter的block都leave后,会执行dispatch_group_notify的block。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容