Swift 中的两个异步函数应该同时启动,然后在某个时刻等待。我已经找到了一个解决方案,但我对语法并不是 100% 满意。如果可能的话,我想用更清晰的语法编写以下代码。
Task {
async let task1: () = task1()
async let task2: () = task2()
_ = await [task1, task2]
}
func task1() async { }
func task2() async { }
您当前的代码是完全可以接受的,但我确实认为
TaskGroup
更好地表达了您的意图。
await withTaskGroup(of: Void.self) { taskGroup in
taskGroup.addTask { await task1() }
taskGroup.addTask { await task2() }
// or alternatively:
// taskGroup.addTask(operation: task1)
// taskGroup.addTask(operation: task2)
}
顺便说一下,您需要将
task1
/task2
函数标记为 @Sendable
,以便在任务之间传递它们,无论您最终采用哪种方法。
TaskGroup 在我看来是用于动态范围的任务,而不是用于两个硬编码的任务。
它当然可以处理动态数量的任务,但对于固定数量的任务来说也完全没问题。事实上,您使用的结构化并发语法实际上只是在底层构造任务组的语法糖。
出于某种原因,我需要显式声明返回类型,即使从 func 返回类型中可以清楚地看出返回类型
大多数将
Void
(()
) 结果分配给变量可能是无意的,因此这是语法盐,以确认这确实是您的意图。真正需要这样做的情况非常罕见且不寻常。