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

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】【 AFNetworking】)