这是一个小测试台,显示两个同时启动的任务,无论哪个先完成都会取消另一个:
func startTest() async throws {
Task { await test() }
try await Task.sleep(nanoseconds: 1 * NSEC_PER_SEC)
// comment out this next line to test the timeout
NotificationCenter.default.post(name: .init("Test"), object: nil)
}
func test() async {
let notificationTask = Task {
for await _ in NotificationCenter.default
.notifications(named: .init("Test"), object: nil)
.prefix(1) {}
print("Done waiting for the notification")
}
let timeoutTask = Task {
try await Task.sleep(nanoseconds: 5 * NSEC_PER_SEC)
notificationTask.cancel()
print("I timed out and cancelled the notification task")
}
await notificationTask.value
timeoutTask.cancel()
print("finished!")
}
正如您所看到的,我们的想法是,要么我们在 5 秒内收到通知,在这种情况下,五秒计时器被取消,要么我们在 5 秒内超时,在这种情况下,等待通知被取消。
我的问题是:有没有更简洁的方式来表达这一点?我尝试了各种任务组和 async let 公式,但没有想出任何办法。也许这是“正确”的方式,但不知何故它令人烦恼。
TaskGroup
await tg.next()
等待“比赛获胜者”的结果tg.cancelAll()
取消未完成的任务