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
相关产品推荐
相关产品推荐

