1. iOS | 如何简单优雅的处理多个接口依次请求
这几个接口的调用是依次进行的,并且基于上一个接口返回的数据。
如果直接在接口的回调里请求下一个接口,类似这样:
// 全部依次请求成功才算成功,有一个失败就是失败
- (void)loadDataSuccess:(void (^)(void))success failure:(void (^)(void))failure {
// 请求接口1
[Request loadData1Success:^{
// 请求接口2
[Request loadData2Success:^{
// 请求接口3
[Request loadData3Success:^{
!success ?: success();
} failure:^{
!failure ?: failure();
}];
} failure:^{
!failure ?: failure();
}];
} failure:^{
!failure ?: failure();
}];
}
如果只是两个接口还好,超过两个估计你自己都看不下去了。这种写法虽然简单粗暴加直观,但如果深层嵌套就有点惨不忍睹了,最重要的是影响可读性。
这种写法也号称最low的写法,基本上可以说是新手专属。其实先不论low不low,影响可读性就肯定是不能接受的。
方法 - 1
我只需简单运用局部block就可以很好的解决这个问题,还是那几个接口,现在我搭配局部block:
// 全部依次请求成功才算成功,有一个失败就是失败
- (void)loadDataSuccess:(void (^)(void))success failure:(void (^)(void))failure {
// 接口2请求成功
void (^loadData2Success)(void) = ^{
// 请求接口3
[Request loadData3Success:^{
// 所有接口请求成功
success();
} failure:^{
failure();
}];
};
// 接口1请求成功
void (^loadData1Success)(void) = ^{
// 请求接口2
[Request loadData2Success:^{
// 接口2请求成功
loadData2Success();
} failure:^{
failure();
}];
};
// 请求接口1
[Request loadData1Success:^{
// 接口1请求成功
loadData1Success();
} failure:^{
failure();
}];
}
将多层嵌套分解为多个局部block,依旧是简单直白的代码,但是却完美规避了深层嵌套的问题,逻辑也很清晰。
那么如何改善这坨代码的可读性?
- 不用GCD
- 不同RAC
- 不用信号量
链接:https://www.jianshu.com/p/c5418df914fc
后续完善
2. iOS 如何让多次请求只执行一次
使用这个函数来实现
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
例子:
dic是要传的参数
[self performSelectorOnMainThread:@selector(sendData:) withObject:dic waitUntilDone:NO];
//实现方法
-(void)sendData: (NSDictionary *)dic {
[self performSelector:@selector(send:) withObject:dic afterDelay:10];
}
-(void)send: (NSDictionary *)dic {
NSLog(@”%@”,dic);
}