2016-04-25 5 views
3

Ich fühle mich wie ich den Dreh RxSwift zu bekommen fange an - jedoch habe ich traf nur eine Straßensperre. Hier ist ein Objekt, das ich für eine Demo erstellt habe (ich habe es vereinfacht, bevor es auf SO hochgeladen wurde). Mein Problem ist, dass bei einem Netzwerkfehler während des Hochladevorgangs alle Abonnements entsorgt werden. Wenn ich also wieder auf rightBarButtonItem tippe, passiert nichts.Re-Anmeldung zu einer beobachtbaren nach Fehler

Was ist der richtige/bessere Weg, dies zu modellieren? Ich bin mir nicht sicher, ob ich die Verwendung von PublishSubject s richtig verstanden habe!

let activityIndicator = ActivityIndicator() 
let disposeBag = DisposeBag() 

let rx_upload = PublishSubject<Void>() 
let rx_progress = PublishSubject<RxProgress>() 
let rx_uploadComplete = PublishSubject<Look>() 

override init() { 
    super.init() 

    activityIndicator 
     .drive(UIApplication.sharedApplication().rx_networkActivityIndicatorVisible) 
     .addDisposableTo(disposeBag) 

    let upload = rx_upload 
     .debug("Upload") 
     .flatMapLatest { [unowned self] -> Observable<(JSON?, RxProgress)> in 
      return self.upload() 
     } 
     .share() 

    upload 
     .map { $0.1 } 
     .debug("Upload Progress") 
     .bindTo(rx_progress) 
     .addDisposableTo(disposeBag) 

    upload 
     .filter { $0.0 != nil } 
     .map { Post(jsonData: $0.0!) } 
     .filterNil() 
     .debug("Upload Complete") 
     .bindTo(rx_uploadComplete) 
     .addDisposableTo(disposeBag) 

} 

func upload() -> Observable<(JSON?, RxProgress)> { 
    // ... 
} 

Und in ViewController.swift ...

self.navigationItem.rightBarButtonItem?.rx_tap 
.bindTo(postUploader.rx_upload) 
.addDisposableTo(disposeBag) 

Antwort

4

gibt es 2 Möglichkeiten:

  1. Prevent Observablen wegen Error Ereignisse angeordnet sind.
    Sie können dies tun, indem Sie catchError Familie verwenden.

  2. Re-subscribe sofort von retry Familie mit.

Base auf dem Weg Sie Ihren Code schreiben, gehe ich davon aus, dass kein Codebeispiel benötigt wird: D

, jedoch vorsichtig sein, dass, wenn ein SubjectError oder Completed Ereignisse empfängt, wird es nicht mehr senden weitere Ereignisse