请求类声明2个属性
@property (nonatomic, strong)dispatch_semaphore_t semaphore;
@property (nonatomic, strong)dispatch_queue_t quene;
实现方法:在封装请求类中的init方法中实现
//创建信号量
self.semaphore = dispatch_semaphore_create(1);
self.quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
请求方法中实现无感的交换token
- (void)POST:(NSString *)URLString
parameters:(NSDictionary*)parameters
showHUD:(BOOL)isshow
success:(SuccessBlock)success
failure:(FailureBlock)failure{
//任务一:换取token
dispatch_async(self.quene, ^{
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
if (![URLString isEqualToString:@"不需要交换token的接口"]) {
//判断token是否过期,过期的话需要请求新的token
if ([self accessTokenOverdue]) {
[self requestAccessTokenWithResult:^(id requestDic, NSString *msg) {
if (requestDic == 100) {
NSLog(@"更换token成功");
//更换token成功,释放信号量,继续执行任务二
dispatch_semaphore_signal(self.semaphore);
} else {
//dispatch_semaphore_signal(self.semaphore);
NSLog(@"更换token失败,跳转到登录界面");
}
}];
}else{
dispatch_semaphore_signal(self.semaphore);
}
} else {
dispatch_semaphore_signal(self.semaphore);
}
});
//任务二:继续请求
dispatch_async(self.quene, ^{
//设置等待任务
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
[self.session POST:URLString parameters:parameters headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//请求成功,释放信号量
dispatch_semaphore_signal(self.semaphore);
//继续处理接下来的UI绘制
[self dealWithResponseObject:responseObject success:^( id requestDic, NSString *msg) {
success(requestDic,msg);
} failure:^(NSString *errorInfo) {
//请求失败,也要释放信号量,不然无法进行下一次的请求任务
dispatch_semaphore_signal(self.semaphore);
failure(errorInfo);
}];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
dispatch_semaphore_signal(self.semaphore);
failure(@"网络太差,操作未完成");
}];
});
}
网友评论