开发中接口偶尔也会遇到接口数据依赖的问题,比如接口二需要接口一返回的某个回参作为入参才能请求,这时就需要等接口一请求完成在去调用接口二。一般都是使用信号量、GCD等。
遇到这种问题博主一般都是使用信号量。如下发
__block dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
NSDictionary *arguments = @{@"type":@(1)};
[Network JSON_POST:arguments view:self.view prefix:@"" funItem:@"" success:^(NSDictionary * _Nonnull response){
dispatch_group_leave(group);
} error:^(NSDictionary * _Nonnull response) {
} failure:^{
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
或者使用下面的嵌套地狱,优点是很直观的解决了问题,缺点是如果只有两层嵌套还好,当多的时候能让人看的头皮发麻,后期维护麻烦还容易被喷。
//接口一
[Network requestData:^{
//接口二
[Network requestData2:^{
} error:^{
!error ?: error();
}];
} error:^{
!error ?: error();
}];
然后想到了局部的block,block是可以写在方法内的,同时block看着更直白,方便。
- (void)viewDidLoad {
[super viewDidLoad];
void (^requestData3)(NSString *value) = ^(NSString *value){
// 接口3
[Network request:@{@"data3":value} success::^{
//三个接口依次请求完成
success();
} failure:^{
failure();
}];
};
void (^requestData2)(NSString *value) = ^(NSString *value){
// 接口2
[Network request:@{@"data2":value} success::^{
// 所有接口请求成功
requestData3(@"调用data3");
} failure:^{
failure();
}];
};
[Network request:@{@"data1":@"a"} success:^{
// 接口1
requestData2(@"调用data2");
} failure:^{
failure();
}];
}