2016-01-18 20 views
5

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

cevap

3

. Eğer benim ViewModel hala onlar sadece birbirleriyle ve cari sahneyi istifleme gibi sahne değişikliği yaşadığını fark etmedi :) shareReplay(1)

+0

sayesinde kullanımı bir zamanlar çağrılacak istiyorsanız

bir olayı yayan olduğunu ExampleViewModel abone oldu. –