下面是一个小测试平台,它显示了两个同时开始的任务,先完成的会取消另一个:
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!")
}
如您所见,我们的 idea 是要么在5秒内收到通知,在这种情况下取消5秒计时器,要么在5秒内超时,在这种情况下,等待通知的情况被取消.
我的问题是:有没有更简洁的方式来表达这一点?我try 了各种任务组和异步LET配方,但什么都没有想出来.也许这是"正确的"方式,但不知何故,这让人恼火.