gpt4 book ai didi

ios - RequestRetrier Alamofire 锁不工作

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:58 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com