gpt4 book ai didi

swift - flatMap() 在单个事件上调用两次

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:16 24 4
gpt4 key购买 nike

我有一个 ViewController,在其中的 init() 我使用 PublishSubject 创建了一个热流。然后,我在 viewDidLoad() 中使用 stream.asObservable() 将流传递到我的 ViewModel,作为 ViewModel 有其他依赖项,它们是从 View 生成的流,因此它必须等到 View 的绑定(bind)完成才能创建 ViewModel。创建 ViewModel 后,我将 ViewController 中的一个事件推送到流中,然后期望 ViewModel 通过触发异步请求(也已包装)对事件使用react与 Rx)。

View Controller :

class ExampleViewController: ViewController {

....

private let exampleStream: PublishSubject<Bool>

init() {
self.exampleStream = PublishSubject<Bool>()
}

viewDidLoad() {
self.viewModel = viewModelFactory.create(exampleStream.asObservable())
self.exampleStream.onNext(true)
}

....
}

View 模型:

class ExampleViewModel {

init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}

private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}

我的问题是,当流中只有一个事件时,doSomethingAsyncThatReturnsAnObservable() 被调用了两次。我已经通过使用 var count = 1; 检查了这个事实。 stream.subscribeNext { _ in print(count++) } 打印 1

知道为什么 subscribeNext() 在每个事件上触发一次,而 flatMap() 触发两次吗?

最佳答案

这是因为 flatMap 调用了每个订阅。

如果你希望它被调用一次使用shareReplay(1)

关于swift - flatMap() 在单个事件上调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com