flatMap() 在单个事件上调用两次
flatMap() called twice on single event
我有一个 ViewController
,其中 init()
我使用 PublishSubject
创建了一个热流。然后我使用 viewDidLoad()
中的 stream.asObservable()
将流传递到我的 ViewModel
,因为 ViewModel
有其他依赖项,这些依赖项是从视图生成的流,所以它必须等待直到在创建 ViewModel
之前完成视图的绑定。创建 ViewModel
后,我将 ViewController
中的一个事件推送到流中,然后期望 ViewModel 通过触发异步请求(也已用 Rx 包装)对事件做出反应。
ViewController:
class ExampleViewController: ViewController {
....
private let exampleStream: PublishSubject<Bool>
init() {
self.exampleStream = PublishSubject<Bool>()
}
viewDidLoad() {
self.viewModel = viewModelFactory.create(exampleStream.asObservable())
self.exampleStream.onNext(true)
}
....
}
视图模型:
class ExampleViewModel {
init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}
private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}
我的问题是,当流中只有一个事件时,doSomethingAsyncThatReturnsAnObservable()
被调用了两次。我已经使用打印 1
.
的 var count = 1; stream.subscribeNext { _ in print(count++) }
检查了这个事实
知道为什么 subscribeNext()
在每个事件上触发一次而 flatMap()
触发两次吗?
这是因为 flatMap
调用了每个订阅。
如果你希望它被调用一次使用shareReplay(1)
我有一个 ViewController
,其中 init()
我使用 PublishSubject
创建了一个热流。然后我使用 viewDidLoad()
中的 stream.asObservable()
将流传递到我的 ViewModel
,因为 ViewModel
有其他依赖项,这些依赖项是从视图生成的流,所以它必须等待直到在创建 ViewModel
之前完成视图的绑定。创建 ViewModel
后,我将 ViewController
中的一个事件推送到流中,然后期望 ViewModel 通过触发异步请求(也已用 Rx 包装)对事件做出反应。
ViewController:
class ExampleViewController: ViewController {
....
private let exampleStream: PublishSubject<Bool>
init() {
self.exampleStream = PublishSubject<Bool>()
}
viewDidLoad() {
self.viewModel = viewModelFactory.create(exampleStream.asObservable())
self.exampleStream.onNext(true)
}
....
}
视图模型:
class ExampleViewModel {
init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}
private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}
我的问题是,当流中只有一个事件时,doSomethingAsyncThatReturnsAnObservable()
被调用了两次。我已经使用打印 1
.
var count = 1; stream.subscribeNext { _ in print(count++) }
检查了这个事实
知道为什么 subscribeNext()
在每个事件上触发一次而 flatMap()
触发两次吗?
这是因为 flatMap
调用了每个订阅。
如果你希望它被调用一次使用shareReplay(1)