LoginSignup
20
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-19

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の必要性を利用側の責任にするのは良い実装では無いですね…。

20
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
19