- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个看起来像这样的值
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/
我有一个看起来像这样的值 lazy var authHeaders: [String: String] = { if shouldTokenBeRefreshed() {
显然,如果我处理不同的队列,我只能使用 DispatchSemaphore。但是,如果我想在同一队列(在本例中为主队列)上运行异步代码怎么办? let s = DispatchSemaphore(va
我创建了一个函数 getFriends,它从 firestore 中读取用户的好友列表,并将每个好友放入 LocalUser 对象(这是我的自定义用户类)中,以便在表格 View 中显示好友列表。我需
所以我一直在尝试使用 NetworkExtension 来制作玩具 VPN 实现,但我遇到了完成处理程序/异步运行代码的问题。我将引导您完成我的思路/实验,如果您能指出我错误的地方以及如何解决此问题,
我一直在使用 NSLock 来同步敏感的代码部分,但一直遇到问题,因为它们必须从锁定它们的同一线程解锁。然后我发现 GCD 的 DispatchSemaphore 似乎在做同样的事情,而且更方便的是它
想象一个屏幕 S。用户到达 S,看东西。有一个按钮 B ... | | | B| | | | | 当你按下 B .. func clickedB() { blockingS
我得到了三个分派(dispatch)线程,名为 queueA、queueB、queueC。 现在我希望在 queueB 和 queueC 完成后执行 queueA。 所以我尝试通过DispatchSe
vc1 插入 vc2 并进入 vc2。 在 vc2 中,我有一个字符串数组,我将其转换为 url,最终通过 URLSession,返回的图像将转换为带有过滤器的图像。一旦我在 URLSession 回
我试图在方法外使用一些 json 响应,但在执行方法时它返回空数组,但在 block 内按预期工作,我的方法是否有任何方式返回预期值,这是我的示例代码: func getCarouselContent
我想在 swift 中按顺序运行一个 for 循环,DispatchGroup 会一起触发它们,所以我想使用 DispatchQueue 和 DispatchSemaphore 来实现我的目标。我的程
我是一名优秀的程序员,十分优秀!