美文网首页
ios:如何实现无感更换请求token

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

作者: xing_x | 来源:发表于2022-12-29 16:53 被阅读0次

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

    相关文章

      网友评论

          本文标题:ios:如何实现无感更换请求token

          本文链接:https://www.haomeiwen.com/subject/xvrzqdtx.html