Swift中GCD转async/await:如何实现performTask方法
基于async/await的performTask实现
根据你已改写的handleResult()和doSomeAsyncTask(),可以这样实现performTask,完全对应原GCD版本的逻辑:
func performTask(completion: (() -> ())?) async { // 等待异步任务结果,替代原GCD的闭包回调 let isSuccess = await doSomeAsyncTask() if isSuccess { // 成功分支:先执行handleResult,再调用completion(对应原逻辑中handleResult接收completion的场景) await handleResult() completion?() } else { // 失败分支:先调用completion,再执行handleResult(对应原逻辑中先触发completion再调用无completion的handleResult) completion?() await handleResult() } }
逻辑说明
- 原GCD版本通过闭包接收
doSomeAsyncTask的结果,async/await版本直接用await获取返回值,代码更线性易读。 - 针对completion的调用时机:
- 任务成功时:原逻辑是将completion传给
handleResult处理,这里假设你改写后的handleResult()已完成核心逻辑,后续直接调用completion?()即可(如果原handleResult是在内部异步操作后调用completion,现在因为handleResult是async函数,await会等待它完成,之后再触发completion完全匹配原逻辑)。 - 任务失败时:和原逻辑一致,先主动调用
completion?(),再等待handleResult()执行完成。
- 任务成功时:原逻辑是将completion传给
补充:优化doSomeAsyncTask的实现
你当前的doSomeAsyncTask写法可以简化,原GCD版本是在DispatchQueue.main异步执行,正确的async/await适配应该保留队列逻辑:
func doSomeAsyncTask() async -> Bool { await withCheckedContinuation { continuation in DispatchQueue.main.async { continuation.resume(returning: Bool.random()) } } }
原写法中嵌套Task是多余的,直接在目标队列中调用resume即可保证结果在正确的上下文返回。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

