美文网首页iOS技术栈
for循环中嵌套异步请求问题 【OC】【 AFNetworkin

for循环中嵌套异步请求问题 【OC】【 AFNetworkin

作者: 冼强輝 | 来源:发表于2018-11-28 11:59 被阅读0次

    for循环中嵌套了异步请求会导致顺序错乱

    简单明了的例子:

    //for中嵌套异步时,执行顺序会混乱
    
    - (void)forinMatchListWithList:(NSArray *)list {
        
        __weak typeof(self) weakSelf = self;
        
        for (int i = 0; i < list.count; i++) {
            
            NSString *url = [NSString stringWithFormat:@"%@%@", URL_DataInfo, list[i][@"InfoId"]];
    
            [NetworkManager GET:url parameters:nil success:^(NSDictionary *resultDic) {
                
                if ([resultDic[@"code"] intValue] == 200) {
                    Model *model = [[Model alloc] init];
                    [model configData:resultDic[@"data"]];
                    
                    [weakSelf.datas addObject:model];
                    
                    [weakSelf.table_list reloadData]; 
                } 
            } failure:^(BOOL isNetError, id error) {
                
            }];
        }
    }
    
     [weakSelf forinMatchListWithList:list];
    //第5次循环
    //第2次循环
    //第3次循环
    //第4次循环
    //第1次循环
    

    而且tableview因为reloadData需要时间刷新界面,同时返回数据,会使得界面无法正常刷新出数据!

    //用递归代替for循环,可以保证正常执行顺序
    
    - (void)forinMatchListWithList:(NSArray *)list index:(int)index{
        
        __weak typeof(self) weakSelf = self;
        
            NSString *url = [NSString stringWithFormat:@"%@%@", URL_DataInfo, list[index][@"InfoId"]];
    
            [NetworkManager GET:url parameters:nil success:^(NSDictionary *resultDic) {
                
                if ([resultDic[@"code"] intValue] == 200) {
             
                    Model *model = [[Model alloc] init];
                    [model configData:resultDic[@"data"]];
                    
                    [weakSelf.datas addObject:model];
                    
                    if (index == list.count-1) {
                        [weakSelf.table_list reloadData];
                    }
                    else {
                        [weakSelf forinMatchListWithList:list index:index+1];
                    }
                }
                
            } failure:^(BOOL isNetError, id error) {
                if (index == list.count-1) {
                    [weakSelf.table_list reloadData];
                }
                else {
                    [weakSelf forinMatchListWithList:list index:index+1];
                }
            }];
             
    }
    
     [self forinMatchListWithList:list index:0];
    
    数据请求顺序正常,而且界面等数据请求完才刷新,体验良好。
    

    参考:https://blog.csdn.net/lp15203883326/article/details/83068339《for循环中嵌套异步请求问题》

    相关文章

      网友评论

        本文标题:for循环中嵌套异步请求问题 【OC】【 AFNetworkin

        本文链接:https://www.haomeiwen.com/subject/qesaqqtx.html