2017-06-12 9 views
2

Ich habe eine Methode 'getProducts' meiner Meinung nach Modell:RxSwift Netzwerkstatus zu beobachten

struct MyViewModel { 
    func getProducts(categoryId: Int) -> Observable<[Product]> { 
     return api.products(categoryId: categoryId) 
    } 
    var isRunning: Observable <Bool> = { 
     ... 
    } 
} 

api.products ist eine private Variable, die URLSession rx Erweiterung verwendet: session.rx.data(...) im Hintergrund.

Ich möchte einige IsRunning-Beobachter in meinem Ansichtsmodell haben, die ich abonnieren könnte, um zu wissen, ob es eine Netzwerkanforderung ist.

Kann ich etwas tun, ohne Änderungen an meiner API-Klasse vorzunehmen?

Ich bin neu in der reaktiven Programmierung, so dass jede Hilfe geschätzt werden würde.

Danke.

Antwort

2

Hier ist eine Lösung mit einer Hilfsklasse geschrieben von RxSwift Autoren in RxSwift Examples namens ActivityIndicator.

Die Ideen ist einfach

struct MyViewModel { 
    /// 1. Create an instance of ActivityIndicator in your viewModel. You can make it private 
    private let activityIndicator = ActivityIndicator() 

    /// 2. Make public access to observable part of ActivityIndicator as you already mentioned in your question 
    var isRunning: Observable<Bool> { 
     return activityIndicator.asObservable() 
    } 

    func getProducts(categoryId: Int) -> Observable<[Product]> { 
     return api.products(categoryId: categoryId) 
      .trackActivity(activityIndicator) /// 3. Call trackActivity method in your observable network call 
    } 
} 

In den entsprechenden Viewcontroller Sie jetzt IsRunning Eigenschaft abonnieren können. Zum Beispiel:

viewModel.isLoading.subscribe(onNext: { loading in 
     print(loading) 
    }).disposed(by: bag) 
+0

Was muss ich importieren, um trackActivity auf meinem Observable aufrufen zu können? – Greg

+0

Die Quelldatei von ActivityIndicator (der Link wird in meiner Antwort veröffentlicht) enthält bereits die Methode trackAcivity als Teil der ObservableConvertibleType-Erweiterung – Nimble

+0

Danke, das habe ich gesucht. – Greg