如何用Swift实现类似JavaScript基于Promise的async/await信号量?
以下是一段简化的JavaScript代码,实现了一个可手动解锁的信号量逻辑:
let unlockResolve = () => {} async function semaphore() { await new Promise((resolve) => { unlockResolve = resolve }) } async function stopAtTheRedLight() { await semaphore() } function unlocksSemaphore() { unlockResolve() unlockResolve = () => {} } await stopAtTheRedLight() // 其他地方: // [...] unlocksSempahore()对应的基于async/await的Swift代码是什么?
对应的Swift实现
在Swift的async/await体系中,可以使用CheckedContinuation来实现类似JavaScript中手动控制Promise resolve的逻辑,以下是对应代码:
// 存储用于恢复挂起任务的continuation,可选类型避免重复调用 private var unlockContinuation: CheckedContinuation<Void, Never>? func semaphore() async { await withCheckedContinuation { continuation in unlockContinuation = continuation } } func stopAtTheRedLight() async { await semaphore() } func unlocksSemaphore() { unlockContinuation?.resume() unlockContinuation = nil // 重置,防止重复调用导致崩溃 } // 使用示例 Task { await stopAtTheRedLight() // 解锁后会执行这里的代码 } // 其他地方调用解锁 // unlocksSemaphore()
代码说明
unlockContinuation对应JS里的unlockResolve,用来存储需要恢复的挂起任务semaphore()通过withCheckedContinuation挂起当前任务,直到resume()被调用stopAtTheRedLight()直接调用semaphore()实现等待逻辑unlocksSemaphore()恢复挂起的任务,并重置continuation避免重复调用
注意:实际开发中如果涉及多线程访问,需要给unlockContinuation添加线程安全保护(比如用actor或者DispatchQueue同步访问),防止竞态条件。
内容的提问来源于stack exchange,提问作者oxygen
相关产品推荐
相关产品推荐

