Swift中基于Alamofire的Refresh Token、重试计数及请求重发问题咨询
方案修改步骤
你现有代码的核心问题是getRefreshToken是异步执行,且没有绑定重试逻辑和重试次数限制,按以下步骤调整即可:
1. 改造getRefreshToken函数,新增异步完成回调
原函数内部的返回值无法同步传递给外部调用方,需新增回调参数传递刷新结果:
func getRefreshToken(completion: @escaping (Bool) -> Void) { DataProvider.main.serviceLogin(username:User, password:Pass, firmNo: FirmId , callback:{success, result in do{ if success { let model = try JSONDecoder().decode(Login.self, from: result as! Data) if model.isSuccess == true { DataProvider.main.token = model.token completion(true) return } } completion(false) } catch let e { print(e) completion(false) } }) }
2. 给getDataFromWeb新增重试次数参数,绑定重试逻辑
新增retryCount参数(默认值为0,首次调用不用传),设置最大重试次数(示例设为2,可自行调整),刷新token成功后重新发起请求,超过重试次数则走失败回调:
/// 最大重试次数,可根据业务调整 private let maxRetryCount = 2 @objc private func getDataFromWeb(params:NSMutableDictionary, retryCount: Int = 0, callback:@escaping (_ success:Bool, _ result:Any?)->(Bool)) -> Void { var method = HTTPMethod.get var encoding = URLEncoding.default as ParameterEncoding if(params["Method"] as! String == "POST"){ method = HTTPMethod.post encoding = Alamofire.JSONEncoding.default } Alamofire.request(url, method:method, parameters:pr, encoding:encoding, headers:[ "Accept":"application/json", "Authorization":"Bearer \(DataProvider.main.token ?? "")"]) .downloadProgress(closure: { (progress) in //progress closure }) .validate(statusCode: 200..<300) .response { [weak self] response in guard let self = self else { return } print(response.error?.localizedDescription) let code = response.response?.statusCode if code == 401 || code == 403, retryCount < self.maxRetryCount { // 未达最大重试次数,先刷新token self.getRefreshToken(completion: { refreshSuccess in if refreshSuccess { // 刷新成功,重试请求,重试次数+1 self.getDataFromWeb(params: params, retryCount: retryCount + 1, callback: callback) } else { // 刷新失败,走失败回调 _ = callback(false, response.data) } }) } else { // 非认证错误/已达最大重试次数,正常回调 _ = callback(response.data?.count != 0, response.data) } } }
改动说明
- 重试次数通过参数传递,每次重试自动累加,到达上限后不再重试,避免无限循环
- 刷新token成功后才会发起重试,且重试请求会自动带上新的token
- 若刷新token失败直接返回错误,不会再重试
内容的提问来源于stack exchange,提问作者Tekhe
相关产品推荐
相关产品推荐

