swift mvvm swift2 rx-swift

swift - flatMap() llamado dos veces en evento único



mvvm swift2 (1)

Tengo un ViewController en el que en el init() creo una corriente caliente usando PublishSubject . Luego paso la transmisión a mi ViewModel utilizando stream.asObservable() en viewDidLoad() , ya que ViewModel tiene otras dependencias que son secuencias generadas a partir de las vistas, por lo que debe esperar hasta que se ViewModel el enlace de las vistas antes de crear el ViewModel . Después de crear ViewModel , introduzco un evento en mi ViewController en la transmisión y luego espero que ViewModel reaccione ante el evento activando una solicitud asincrónica (que también se completó con 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> { ... } }

Mi problema es que doSomethingAsyncThatReturnsAnObservable() se llama dos veces cuando solo hay un evento dentro de la secuencia. He verificado ese hecho usando var count = 1; stream.subscribeNext { _ in print(count++) } var count = 1; stream.subscribeNext { _ in print(count++) } que imprime 1 .

¿Alguna idea de por qué subscribeNext() dispara una vez en cada evento pero flatMap() dispara dos veces?


Esto se debe a que flatMap llamó en cada suscripción.

Si quieres que se llame una vez, usa shareReplay(1)