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)