我想使用异步/等待调用来实现多播委托之类的功能,因此如果多个客户端调用相同的
async
方法,当该值返回时,所有客户端都会收到它。
例如,使用纯回调可能是这样的(简化的):
struct DataSource {
typealias Listener = (Value) -> Void
private var listeners: [Listener] = []
func fetchData(_ callback: Listener) {
listeners.append(callback)
let value = ... // Get data from some async service
listeners.forEach { $0(value) }
}
}
但是对于 async/await 我有点迷失,如果我有这个:
struct DataSource {
func fetchData() async -> Value {
let value = ... // Get data from some async service
return value
}
}
如何获取N个不同地方的返回值?不是新并发系统的专家,所以也许我错过了一些东西。
您可以按住
Task
而不是值,然后您就可以做您想做的事情:
let task = Task { try await fetchData() } // 👈 hold on to the task
let listener1 = await task.result
let listener2 = await task.result
请注意,这将不会调用任务两次,只是等待结果。