ios:如何实现无感更换请求token

2022-12-29  本文已影响0人  xing_x

请求类声明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(@"网络太差,操作未完成");
                }];
    });
}
上一篇下一篇

猜你喜欢

热点阅读