開發(fā)中接口偶爾也會遇到接口數(shù)據(jù)依賴的問題,比如接口二需要接口一返回的某個回參作為入?yún)⒉拍苷埱?,這時就需要等接口一請求完成在去調(diào)用接口二。一般都是使用信號量、GCD等。
遇到這種問題博主一般都是使用信號量。如下發(fā)
__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(), ^{
});
或者使用下面的嵌套地獄,優(yōu)點(diǎn)是很直觀的解決了問題,缺點(diǎn)是如果只有兩層嵌套還好,當(dāng)多的時候能讓人看的頭皮發(fā)麻,后期維護(hù)麻煩還容易被噴。
//接口一
[Network requestData:^{
//接口二
[Network requestData2:^{
} error:^{
!error ?: error();
}];
} error:^{
!error ?: error();
}];
然后想到了局部的block,block是可以寫在方法內(nèi)的,同時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(@"調(diào)用data3");
} failure:^{
failure();
}];
};
[Network request:@{@"data1":@"a"} success:^{
// 接口1
requestData2(@"調(diào)用data2");
} failure:^{
failure();
}];
}