这不是滥用Task的真正问题吗?正如您所发现的,任务本身并不是您可以等待的事情。如果目标是在后台运行慢代码,请使用演员。然后你可以用 await 干净地调用一个actor方法。
let myActor = MyActor()
await myActor.doFirStuff()
await myActor.doAirportStuff()
self.isVerifyingRoute = false
但是,我们还需要确保我们在交谈时处于主线程上self
——这是您的代码忽略的事情。这是一个例子:
actor MyActor {
func doFirStuff() async {
print("starting", #function)
await Task.sleep(2 * 1_000_000_000)
print("finished", #function)
}
func doAirportStuff() async {
print("starting", #function)
await Task.sleep(2 * 1_000_000_000)
print("finished", #function)
}
}
func test() {
let myActor = MyActor()
Task {
await myActor.doFirStuff()
await myActor.doAirportStuff()
Task { @MainActor in
self.isVerifyingRoute = false
}
}
}
一切都在正确的模式下发生:耗时的事情发生在后台线程上,调用self
发生在主线程上。在我看来,处理主线程调用的一种看起来更简洁的方法是有一个@MainActor
方法:
func test() {
let myActor = MyActor()
Task {
await myActor.doFirStuff()
await myActor.doAirportStuff()
self.finish()
}
}
@MainActor func finish() {
self.isVerifyingRoute = false
}
我认为这是优雅而清晰的。