2016-01-18 16 views
5

Ho un ViewController in cui sul init() creo un flusso di hotstream utilizzando PublishSubject. Passo quindi allo stream con il numero nel numero viewDidLoad(), in quanto lo ViewModel ha altre dipendenze generate da flussi provenienti dalle visualizzazioni, quindi deve attendere il completamento del binding delle viste prima di creare lo ViewModel. Dopo aver creato lo ViewModel, inserisco un evento nel mio stream ViewController e poi mi aspetto che il ViewModel reagisca all'evento disattivando una richiesta asincrona (che è stata anche avvolta con Rx).flatMap() chiamato due volte su evento singolo

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> { ... } 
} 

mio problema è che doSomethingAsyncThatReturnsAnObservable() si chiama due volte quando un solo evento è all'interno del flusso. Ho verificato questo fatto utilizzando var count = 1; stream.subscribeNext { _ in print(count++) } che stampa 1.

Qualche idea sul motivo per cui lo subscribeNext() si attiva una volta per ciascun evento ma l'incendio flatMap() viene generato due volte?

risposta

3

Questo perché flatMap ha richiesto ogni abbonamento.

Se si vuole che sia chiamato una volta utilizzare shareReplay(1)

+0

grazie :) non mi rendevo conto che il mio ViewModel viveva ancora sul cambio di scena in quanto sono semplicemente accumulando tra loro e la scena corrente emetteva un evento che l'EsempioViewModel si era iscritto a. –

Problemi correlati