2016-01-18 6 views
5

Ich habe eine ViewController in der auf der init() ich einen heißen Strom mit PublishSubject erstellen. Ich gehe dann in dem Strom meines ViewModelstream.asObservable() im viewDidLoad() verwenden, da die ViewModel anderen Abhängigkeiten hat, die Ströme von den Ansichten erzeugt werden, so hat es, bis die Bindung der Ansichten warten ist abgeschlossen, bevor die ViewModel zu schaffen. Nachdem ich die ViewModel erstellt habe, schiebe ich ein Ereignis in meinem ViewController in den Stream und erwarte dann, dass das ViewModel auf das Ereignis reagiert, indem eine asynchrone Anfrage ausgelöst wird (die auch mit Rx umschlossen wurde).flatMap() rief zweimal auf einzelnes Ereignis

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) 
    } 

    .... 
} 

Ansichtsmodell:

class ExampleViewModel { 

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

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

Mein Problem ist, dass doSomethingAsyncThatReturnsAnObservable() zweimal aufgerufen wird, wenn nur ein Ereignis innerhalb des Stroms ist. Ich habe diese Tatsache mit var count = 1; stream.subscribeNext { _ in print(count++) } überprüft, die 1 druckt.

Eine Idee, warum subscribeNext() einmal bei jedem Ereignis ausgelöst wird, aber flatMap() zweimal ausgelöst wird?

Antwort

3

Dies ist, weil flatMap auf jedem Abonnement aufgerufen wird.

Wenn Sie es wollen, sobald shareReplay(1)

+0

dank Verwendung genannt werden :) ich nicht erkennen, dass mein Ansichtsmodell noch auf Szenenwechsel wurde leben, wie sie nur sie stapeln und die aktuelle Szene ein Ereignis ausstrahlte, dass das ExampleViewModel hatte abonniert. –