post Image
RxSwiftの非同期処理中にProgressHUDを出す

import RxSwift
import SVProgressHUD

extension ObservableType {
  func withHUD(withStatus status: String? = nil) -> Observable<Self.E> {
    return self.do(onNext: nil, onError: { _ in
      SVProgressHUD.showError(withStatus: nil)
    }, onCompleted: {
      SVProgressHUD.showSuccess(withStatus: nil)
    }, onSubscribe: nil, onSubscribed: {
      SVProgressHUD.show(withStatus: status)
    }, onDispose: {
      SVProgressHUD.dismiss()
    })
  }
}

こんな感じにすると

Auth().authorize().withHUD().subscribe(onNext: {
  //hoge
}).disposed(by: bag)

処理にwithHUDを書くだけで処理中に自動でHUDを出してくれる(と思う)

追記

ツッコミありがとうございます

スクリーンショット 2017-11-24 3.05.54.png

MainSchedulerで動作させるのは明示的に書いたほうが良いかと思います。

追記2

スクリーンショット 2017-11-24 3.14.38.png

Observable -> Observableとして実装bind(to binder: (Self) -> T) -> Tに渡す

なるほど!これならObservableの流れを元に副次的に動作していることが明示的に表現されています…!(勉強になりました)

追記3

スクリーンショット 2017-11-24 3.24.02.png

bindした数だけHUDが発行される/Driverならshared/Schedulerの問題は解決する

SharedSequence/Driverにした時点でonErrorが取れなくなるので、今回の実装は出来ない気がしてきました。
ObservableTypeに対してextensionしてSharedSequenceを返す実装にして見るのが近い気もしますが、やっぱりschedulerとsharedの必要性を利用側の責任にするのは良い実装では無いですね…。


『 Swift 』Article List