有了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
操作似乎是不正确的。这真的是最好的办法吗?
2条答案
按热度按时间vojdkbi01#
这可以通过使用
withTaskGroup(of:returning:body:)
的任务组来实现。方法调用是单独的任务,然后我们await
waitForAll()
,当所有任务都完成时继续。验证码:
另一种方法是这样的:
5rgfhyps2#
我为您的actor创建了一个类,以允许这两个方法的并发执行。
将WORK替换为以下内容之一: