gpt4 book ai didi

ios - 如何在闭包中使用 DispatchSemaphore

转载 作者:行者123 更新时间:2023-11-28 11:34:38 24 4
gpt4 key购买 nike

我有一个看起来像这样的值

   lazy var authHeaders: [String: String] = {
if shouldTokenBeRefreshed() {
let semaphore = DispatchSemaphore(value: 0)
refreshTokens {
semaphore.signal()
}
semaphore.wait()
}
return ["Authorization": "Bearer \(module.client.credential.oauthToken)"]
}()

想法是,当请求我的 auth header 时,如果我的 token 已过期,我将刷新它,然后返回新值。

func refreshTokens(completion: @escaping () -> Void) {
guard let token = keychain.get("refresh_token") else { return }

module.renewAccessToken(
withRefreshToken: token,
success: { [weak self] credential, response, parameters in
guard let self = self else { return }
self.storeTokens([
"access_token": credential.oauthToken,
"refresh_token": credential.oauthRefreshToken
])
completion()
},
failure: { error in
print(error.description)
})
}

由于这是一个async 操作,我尝试使用Semaphore 暂停流程,以便在触发完成 block 后让它继续。

但是通话没有解决,我不确定为什么。

最佳答案

这不是您使用 DispatchSemaphore 的方式。

不要强制异步代码同步。

您将需要重构代码以更好地处理您要实现的目标的异步性质。

完成处理程序是更简单、更有效的方法。如果您出于某种原因试图避免这种情况,请查看 PromiseKit 或其他异步帮助程序库。

另一种建议不是在飞行前更新您的 token ,而是在 401 上更新它们,然后重放您的原始更新请求。

关于ios - 如何在闭包中使用 DispatchSemaphore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55870934/

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