You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()执行完成。

补充:优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:46:12