6

RxSwift のコツをつかみ始めたような気がしますが、障害物にぶつかりました。デモ用に作成したオブジェクトを次に示します (SO に投稿する前に簡略化しました)。私の問題は、アップロード プロセス中にネットワーク エラーが発生すると、すべてのサブスクリプションが破棄されることです。そのため、もう一度タップしてrightBarButtonItemも何も起こりません。

これをモデル化する正しい/より良い方法は何ですか? PublishSubjectsの使い方がよくわからない!

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

1 に答える 1