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循环中嵌套异步请求问题》