- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Alamofire 实现 RequestRetrier 以刷新给定用户的 accessToken。
func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
lock.lock() ; defer { lock.unlock() }
if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
requestsToRetry.append(completion)
if !isRefreshing {
refreshToken(completion: { [weak self] succeded, accessToken in
guard let strongSelf = self else { return }
strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }
strongSelf.requestsToRetry.forEach{ $0(succeded, 0.0) }
strongSelf.requestsToRetry.removeAll()
})
}
} else {
completion(false, 0.0)
}
}
当 strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }
被调用它不会继续执行所以我有一个无限循环。我尝试检查 strongSelf.lock.try()
的结果并返回 false。
当我使用错误的密码登录时会发生这种情况,因此服务器返回 401。
这是我的refreshToken代码
guard !isRefreshing else { return }
// ... Get user ... //
if let user = user {
isRefreshing = true
signIn(user: userDTO)
.subscribe(onNext: { [weak self] userSession in
guard let strongSelf = self else { return }
// ... Save accessToken ... //
completion(true, userSession.accessToken)
strongSelf.isRefreshing = false
}, onError: { [weak self] error in
guard let strongSelf = self else { return }
// ... Log out user ... //
completion(false, nil)
strongSelf.isRefreshing = false
})
.disposed(by: bag)
} else {
completion(false, nil)
}
最佳答案
如 Github 问题 https://github.com/Alamofire/Alamofire/issues/2544 中所示我可以通过更改来解决此问题:
private let lock = NSLock()
到
private let lock = NSRecursiveLock()
它们之间的区别在于,如果同一个线程试图锁定,递归锁可以被解锁。
关于ios - RequestRetrier Alamofire 锁不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300379/
我正在尝试像 Alamofire 页面中的示例一样重试请求,但出现此错误: 请求重试代码如下: public typealias RequestRetryCompletion = (_ shouldR
我一直在将我的项目迁移到 swift3,并且一直在努力让 Alamofire RequestRetrier 协议(protocol)发挥作用。我遵循了 Alamofire 4.0 迁移指南: http
我正在使用 RequestRetrier 自动续订 API 的 access_token。但在每个请求函数中,我想捕获超时错误,但是 .responseJSON 正文中的 .case(let erro
我正在尝试实现一种重试机制,我看到 alamofire 有一个。我正在尝试实现一个简单的重试机制,并指定请求的次数,但出现了问题。 class OAuth2Handler: RequestAdapte
我正在使用 Alamofire 实现 RequestRetrier 以刷新给定用户的 accessToken。 func should(_ manager: SessionManager, retry
我正在使用 Alamofire 4.0 的 RequestRetrier 来控制对过期访问 token 的请求的重试。我正在关注文档 here . 我有一个与文档 OAuth2Handler 中提供的
我是一名优秀的程序员,十分优秀!