Swift中async let异常行为:如何等待所有任务完成再执行主线程代码?
解决Swift异步任务未完成就执行主线程代码的问题
你的代码里,async let创建了三个异步任务,但没有等待它们完成就直接执行MainActor.run里的打印逻辑,所以"ALL tasks completed"会提前输出。要解决这个问题,核心是先等待所有异步任务执行完毕,再切换到主线程执行后续操作,具体有两种实现方式:
方式一:通过数组await批量等待任务
直接将三个async let任务放入数组,用await等待整个数组的任务完成,代码如下:
Task { async let task1 = func1() async let task2 = func2() async let task3 = func3() // 等待三个异步任务全部完成 await [task1, task2, task3] await MainActor.run { print("ALL tasks completed") } } func func1() async { try? await someOtherWork() print("func1 complete") } // func2、func3实现与func1类似
方式二:逐个await任务完成
也可以分别await每个async let创建的任务,效果和批量等待一致:
Task { async let task1 = func1() async let task2 = func2() async let task3 = func3() await task1 await task2 await task3 await MainActor.run { print("ALL tasks completed") } }
原理说明
async let声明的任务会立即启动执行,但如果不通过await等待,代码会直接继续往下走,不会等待任务结束。只有当我们调用await时,当前Task才会暂停,直到对应的异步任务执行完毕,之后才会继续执行后续的主线程代码。
内容的提问来源于stack exchange,提问作者tariq
相关产品推荐
相关产品推荐

