2016-04-25 13 views
3

私はRxSwiftのハングアップを始めているように感じます。しかし、私はちょうどロードブロッキングを打ちました。 デモ用に作成したオブジェクトです(私はSOに投稿する前に簡略化しました)。私の問題は、アップロードプロセス中にネットワークエラーが発生した場合、すべてのサブスクリプションが処分されることです。だから私が再び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つのオプションがありますのでErrorイベントの配置されている

  1. 防ぎ観測が。
    catchErrorファミリを使用してこれを行うことができます。

  2. retryファミリーを使用してすぐに再購読してください。

、あなたのコードを書く方法の基本は、私は、サンプルコードが必要とされていないことを前提としています。しかしD

SubjectErrorまたはCompletedイベントを受信した場合、それはもはや送信しないことに注意してくださいそれ以上の出来事。

関連する問題