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

Swift Package Manager:如何运行含异步代码的executableTarget?

解决Swift可执行目标中异步代码未执行的问题

你的问题核心是:主程序在创建异步Task后立刻退出,导致Task里的代码还没来得及执行就被终止了。以下是几种可行的解决方式:

方法1:使用异步主函数(推荐,Swift 5.7+)

将可执行目标的入口改为异步主函数,直接await你的异步操作,这样程序会等待异步任务完成后再退出:

@main
struct AppExecutable {
    static func main() async {
        await Test.launch()
    }
}

struct Test {
    static func launch() async {
        let result = await result()
        // 处理结果或后续逻辑
        print("异步任务执行完成:\(result)")
    }
    
    static func result() async -> String {
        // 模拟异步操作(比如网络请求、文件读写)
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        return "测试结果"
    }
}

方法2:用DispatchGroup等待异步任务完成

如果项目依赖的Swift版本低于5.7,可以借助DispatchGroup让主线程等待异步任务结束:

import Dispatch

func main() {
    let group = DispatchGroup()
    group.enter()
    
    Task {
        await Test.launch()
        group.leave()
    }
    
    // 阻塞主线程,直到异步任务完成
    group.wait()
}

main()

struct Test {
    static func launch() async {
        let result = await result()
        print("异步任务执行完成:\(result)")
    }
    
    static func result() async -> String {
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        return "测试结果"
    }
}

方法3:通过RunLoop循环等待

另一种方式是利用RunLoop让主线程保持活跃,直到异步任务标记完成:

func main() {
    var taskCompleted = false
    
    Task {
        await Test.launch()
        taskCompleted = true
    }
    
    // 循环运行RunLoop,直到任务完成
    while !taskCompleted {
        RunLoop.current.run(until: Date().addingTimeInterval(0.1))
    }
}

main()

struct Test {
    static func launch() async {
        let result = await result()
        print("异步任务执行完成:\(result)")
    }
    
    static func result() async -> String {
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        return "测试结果"
    }
}

无论哪种方法,核心逻辑都是让主程序等待异步任务执行完毕后再退出,避免异步代码被提前终止。

内容的提问来源于stack exchange,提问作者John DoeDoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:53:23