2016-04-25 1 views
3

Я чувствую, что я начинаю получать поддержку RxSwift - однако я просто попал в блокпост. Вот объект, который я построил для демонстрации (я упростил его до публикации на SO). Моя проблема заключается в том, что когда во время процесса загрузки возникает сетевая ошибка, все подписки удаляются. Поэтому, когда я снова нажимаю rightBarButtonItem, ничего не происходит.Повторно подписывается на наблюдение после ошибки

Каков правильный/лучший способ моделирования этого? Я не уверен, что правильно понял PublishSubject s!

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 получает Error или Completed события, он больше не будет посылать любые дальнейшие события.

Смежные вопросы