2016-01-18 7 views
5

ViewController私はinit()PublishSubjectを使用してホットストリームを作成しています。 ViewModelはビューから生成されたストリームであるため、ViewModelを作成する前にビューのバインドが完了するまで待つ必要があるため、ViewModelにを使用してストリームを渡します。 ViewModelを作成した後、ViewControllerのイベントをストリームにプッシュし、ViewModelが非同期リクエスト(これもRxでラップされています)を起動してイベントに反応することを期待します。flatMap()はシングルイベントで2回呼び出されます

の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()が2回呼び出されていることです。私はvar count = 1; stream.subscribeNext { _ in print(count++) }を使ってその事実を確認しました。これは1を印刷します。

なぜ、subscribeNext()が各イベントで1回発生しますが、flatMap()は2回発生しますか?

答えて

3

これは、サブスクリプションごとにflatMapが呼び出されるためです。あなたは私が私のViewModelはまだ彼らはお互いと現在のシーンを積み重ねているとして、シーンチェンジに住んでいたことを実現しませんでした:) shareReplay(1)

+0

感謝を使用することが一度呼ばれるようにしたい場合は

は、イベントを放出していますExampleViewModelが購読していました。 –

関連する問題