使用 Swift 并发,是否有可能拥有类似“未命名”的东西async let
?
这是一个例子。您有以下演员:
actor MyActor {
private var foo: Int = 0
private var bar: Int = 0
func setFoo(to value: Int) async {
foo = value
}
func setBar(to value: Int) async {
bar = value
}
func printResult() {
print("foo =", foo)
print("bar =", bar)
}
}
现在我想设置foo
和bar
使用给定的方法。简单的用法如下所示:
let myActor = MyActor()
await myActor.setFoo(to: 5)
await myActor.setBar(to: 10)
await myActor.printResult()
但是,此代码是按顺序运行的。出于所有意图和目的,假设setFoo(to:)
并且setBar(to:)
可能是一项长期运行的任务。您还可以假设这些方法是互斥的(不共享变量并且不会相互影响)。
要使此代码成为最新的,async let
可以使用。但是,这只是启动任务,直到它们await
稍后被编辑。在我的示例中,您会注意到我不需要这些方法的返回值。我所需要的只是在printResult()
调用之前,之前的任务已经完成。
我可以想出以下内容:
let myActor = MyActor()
async let tempFoo: Void = myActor.setFoo(to: 5)
async let tempBar: Void = myActor.setBar(to: 10)
let _ = await [tempFoo, tempBar]
await myActor.printResult()
显式创建这些任务然后await
ing 一组它们似乎是不正确的。这真的是最好的方法吗?