使用 AsyncPublisher 来代替 AsyncStream。
以下是使用 AsyncPublisher 进行演示的示例代码(假设我们想要在视图中渲染一系列异步生成器生成的数据):
// 定义异步生成器以生成数据
func dataGenerator() -> AsyncGenerator {
AsyncStream { continuation in
// 在此处生成数据并将其发送到视图
continuation.yield("item 1")
continuation.yield("item 2")
continuation.yield("item 3")
continuation.finish()
}.makeAsyncPublisher().makeAsyncGenerator()
}
// 使用异步生成器在视图中渲染数据
struct ContentView: View {
var body: some View {
List {
ForEach(dataGenerator(), id: \.self) { item in
Text(item)
}
}
}
}
上述代码使用 AsyncStream 来创建一个异步生成器来生成数据,并在视图中渲染该数据。 但是,由于 AsyncStream 会在生成器返回完成信号时继续发送事件,因此会导致视图被垃圾邮件。
为了避免这种情况,我们可以使用 AsyncPublisher 来创建异步生成器。 在此示例中,我们将 AsyncStream 包装在 AsyncPublisher 中,然后将其转换回 AsyncGenerator。这将导致异步生成器仅在返回完成信号时发送一次事件,从而在视图中避免垃圾邮件。
示例代码如下:
// 定义异步生成器以生成数据
func dataGenerator() -> AsyncGenerator {
AsyncPublisher { subscriber in
// 在此处生成数据并将其发送到视图
subscriber.receive("item 1")
subscriber.receive("item 2")
subscriber.receive("item 3")
subscriber.receive(completion: .finished)
return AnyCancellable {}
}.makeAsyncGenerator()
}
// 使用异步