私が持ってViewController
いる上init()
、私が使用してホットストリームを作成しますPublishSubject
。私はその後、私はへのストリームを渡すViewModel
使用するstream.asObservable()
にviewDidLoad()
ように、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)
}
....
}
ViewModel:
class ExampleViewModel {
init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}
private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}
私の問題はdoSomethingAsyncThatReturnsAnObservable()
、ストリーム内にイベントが1つしかない場合に、2回呼び出されることです。var count = 1; stream.subscribeNext { _ in print(count++) }
どのプリントを使ってその事実を確認しました1
。
なぜsubscribeNext()
各イベントで1回flatMap()
発砲するのに、2回発砲するのかについて何か考えはありますか?
これはflatMap
、すべてのサブスクリプションで呼び出されるためです。
一度呼び出したい場合は shareReplay(1)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加