我想使用异步/等待调用实现类似多播委派的东西,这样,如果多个客户端调用相同的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) }
    }
}

但对于异步/等待,如果我有这样的情况,我有点迷茫:

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

请注意,这将使NOT调用该任务两次,并等待结果.

Swift相关问答推荐

在swift静态var扩展中,如何或可以访问和返回具体类?

在解码字符串时需要帮助.

通过SwiftUI中的列表 Select 从字典中检索值

SwiftData:非法try 在不同上下文中的对象之间建立关系

可以将属性名称传递给 Swift 中的函数吗?

在表单中对齐文本框

允许为 self 分配新的 struct 值的理由是什么?

在 SwiftUI 中禁用 Select 器选项

类型擦除`AsyncMapSequence, Element>`

如何返回一个通过 SwiftUI 中的另一个协议间接继承 View 协议的 struct ?

SwiftUI 分段 Select 器的问题

如何更新 UserDefault 中的特定值

自定义 DispatchQueue 服务质量

在 SwiftUI 中操作绑定变量

有什么方法可以快速为泛型参数分配默认值?

在 Swift 中强制崩溃的最简单方法

如何在 SwiftUI 中打开 ImagePicker?

如何更改弹出框的大小

SwiftUI - 呈现工作表后导航栏按钮不可点击

playground 导入:没有这样的模块Foo