ios - 如何在闭包中使用 DispatchSemaphore

标签 ios swift asynchronous dispatchsemaphore

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

   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/

相关文章:

ios - 如何实现 iOS 邮件应用程序的多选行为?

ios - 在两个iPhone之间复制核心数据数据库

javascript - 我如何通过 JavascriptCore 注入(inject)和使用这个 javascript 库 (web3)

c# - 从 Microsoft UWP 上的异步方法返回 Task<string>

android - Moai:获取用户输入的标准控件

ios - 当键盘可见时更改 Y 原点时出现奇怪的 UIView 行为

Swift - 我的收藏 View 没有输出额外的数量

javascript - 如何在 Angular 2/4 中启动匿名异步函数?

在 Shiny 的应用程序中异步渲染绘图

ios - 在 iOS 11 上切换键盘时未调用 KeyboardWillShowNotification