Swift如何将completion回调封装为async/await异步接口
Swift回调API封装async/await版本实现方案
完全可以通过Swift的非结构化并发能力实现该需求,你写的示例代码的问题在于误用了Task类型,Swift专门提供了续体(Continuation)机制,用于桥接基于回调的传统API和async/await异步模型。
正确实现代码
func start() async { await withCheckedContinuation { continuation in // 调用原有基于回调的start API start { // 回调触发时恢复续体,继续执行async函数后续逻辑 continuation.resume() } } }
核心逻辑说明
withCheckedContinuation会暂停当前异步函数的执行,生成代表当前执行上下文的续体对象,传入你提供的闭包中- 原有回调API的闭包执行时,调用
continuation.resume()即可恢复之前暂停的异步函数,完成整个异步调用流程 - 如果原有回调携带返回值或者错误信息,可以对应使用
withCheckedThrowingContinuation,调用resume时同步传入返回值或者抛出错误即可
注意事项
- 续体必须且只能被调用一次,
CheckedContinuation自带运行时检查,出现漏调用、重复调用的情况会输出明确的报错提示,适合日常开发使用 - 若对性能有极高要求,可以替换为
UnsafeContinuation,但需要开发者自行保证续体的调用规则,不会有运行时检查提示
内容的提问来源于stack exchange,提问作者Isaaс Weisberg
相关产品推荐
相关产品推荐

