2016-04-25 112 views
3

我覺得我已經開始了RxSwift的懸念 - 但是我剛剛遇到了障礙。 這是我爲演示製作的一個對象(我在發佈之前已經簡化了它)。我的問題是,當上傳過程中出現網絡錯誤時,所有訂閱都會被處理掉。所以當我再次點擊rightBarButtonItem時,沒有任何反應。錯誤後重新訂閱Observable

什麼是正確/更好的建模方式?我不確定我是否正確使用了PublishSubject

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)> { 
    // ... 
} 

而且在ViewController.swift ...

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

回答

4

有2個選項的位置:

  1. 防止觀測正因爲Error事件設置。
    您可以通過使用catchError系列來完成此操作。

  2. 通過使用retry系列立即重新訂閱。

此基礎上編寫代碼的方式,我認爲沒有示例代碼需要:d

但是,要小心,如果一個Subject接收ErrorCompleted事件,將不再發出任何其他事件。