ViewController
adresinde init()
üzerinde PublishSubject
kullanarak bir sıcak akış oluşturuyorum. ViewModel
görünümler elde edilen akışları diğer bağımlılıklar olduğu gibi o zaman, viewDidLoad()
içinde stream.asObservable()
kullanarak ViewModel
için akışında geçmesi, bu yüzden görüş bağlayıcı ViewModel
oluşturmadan önce bitmesini beklemek zorunda. ViewModel
'u oluşturduktan sonra, ViewController
akışımdaki bir etkinliğe akışa itiyorum ve daha sonra ViewModel'in eşzamanlı olmayan bir isteği (Rx ile de sarılmış) gerçekleştirerek etkinliğe tepki vermesini bekliyorum.flatMap() tek olayda iki kez çağrıldı
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> { ... }
}
Benim sorunum sadece bir olay akışı içinde olduğunda doSomethingAsyncThatReturnsAnObservable()
iki defa çağrılır olmasıdır. Bu gerçeği, 1
'u basan var count = 1; stream.subscribeNext { _ in print(count++) }
kullanarak kontrol ettim.
subscribeNext()
niçin her olayda bir kez ateş açıyor, ancak flatMap()
iki kez ateş ediyor? Her bir abonelikte flatMap
numaralı telefondan arandığı için bunun nedeni
sayesinde kullanımı bir zamanlar çağrılacak istiyorsanız
bir olayı yayan olduğunu ExampleViewModel abone oldu. –