2016-04-18 36 views
4

APIコールが完了すると、プログレスバーを表示して非表示にする必要があります。以下は、テーブルにデータを書き込むために書いたコードです。 APIの呼び出しの進捗状況を表示および非表示するための呼び出しはどこで行う必要がありますか?これを行うにはRxSwiftの方法がありますか?Rxswift - 進行状況バーを表示する方法

var disposeBag = DisposeBag() 

...

items = fetchAllAnswers() 
     .subscribeOn(backgroundWorkScheduler) 
     .observeOn(mainScheduler) 
     .subscribe(
       onNext: { data in 
        print("onNext") 
        //show/update progress 
       }, 
       onCompleted: { 
        print("onCompleted") 
        //hide progress 
       }, 
       onDisposed: { 
        print("onDisposed") 
       } 
     ).addDisposableTo(disposeBag) 

答えて

6

あなたはRxSwift repoからActivityIndicatorを使用することがあります。

items = fetchAllAnswers() 
items.bindTo(self.myTableView.rx_itemsWithCellIdentifier("cellIdentifier", cellType: UITableViewCell.self)){ (row, element, cell) in 
    cell.textLabel?.text = element 
} 
.addDisposableTo(disposeBag) 

func fetchAllAnswers() -> Observable<[String]>{ 
    let api = Observable.create { (obsever: AnyObserver<[String]>) -> Disposable in 
     //progress.show() 
     let items = Api.getUsers() 

     obsever.onNext(items) 
     obsever.onCompleted() 
     //progress.hide 
     return AnonymousDisposable{ 
      print("api dispose called") 
     } 
    } 
    return api 
} 
+0

'viewDidLoad'で 'ProgressHUD'にバインドすると、それが表示されます。 'trackActivity'を呼び出す前に –

+0

'MBProgressHUD'は 'trackActivity'が呼び出されたときにのみ表示を開始します。私はすべてのプロジェクトでそれを使用しています。 'trackActivity'を呼び出す前に 'MBProgressHUD'が表示されていれば、何か間違っているかもしれません。私のRxSwiftチュートリアルhttps://github.com/svyatoslav-reshetnikov/ReactiveAppを確認して、実装方法を確認することができます。 – Svyatoslav

1

あなたは、あなたのViewControllerでこの作業を行う。このようなものを持っています。私のプロジェクトでMBProgressHUDを使用しています。 は、最初に、あなたはこのライブラリの拡張機能を作成する必要があります。

extension MBProgressHUD { 

    /** 
    Bindable sink for MBProgressHUD show/hide methods. 
    */ 
    public var rx_mbprogresshud_animating: AnyObserver<Bool> { 
     return AnyObserver { event in 
      MainScheduler.ensureExecutingOnScheduler() 

      switch (event) { 
      case .Next(let value): 
       if value { 
        let loadingNotification = MBProgressHUD.showHUDAddedTo(UIApplication.sharedApplication().keyWindow?.subviews.last, animated: true) 
        loadingNotification.mode = self.mode 
        loadingNotification.labelText = self.labelText 
        loadingNotification.dimBackground = self.dimBackground 
       } else { 
        MBProgressHUD.hideHUDForView(UIApplication.sharedApplication().keyWindow?.subviews.last, animated: true) 
       } 
      case .Error(let error): 
       let error = "Binding error to UI: \(error)" 
       #if DEBUG 
        rxFatalError(error) 
       #else 
        print(error) 
       #endif 
      case .Completed: 
       break 
      } 
     } 
    } 
} 

次あなたのViewControllerクラスでActivityIndi​​catorオブジェクトを作成する必要があります。

let progress = MBProgressHUD() 
progress.mode = MBProgressHUDMode.Indeterminate 
progress.labelText = "Loading..." 
progress.dimBackground = true 

let indicator = ActivityIndicator() 
indicator.asObservable() 
    .bindTo(progress.rx_mbprogresshud_animating) 
    .addDisposableTo(bag) 

次は自分のシーケンスにtrackActivity()関数を使用します。

apiMethod 
.trackActivity(indicator) 
.subscribeNext { stringArray in 
    items.value = stringArray 
} 
.addDisposableTo(bag) 
0

スイフト4

extension MBProgressHUD { 
var rx_mbprogresshud_animating: AnyObserver<Bool> { 

    return AnyObserver { event in 

     MainScheduler.ensureExecutingOnScheduler() 

     switch (event) { 
     case .next(let value): 
      if value { 
       let loadingNotification = MBProgressHUD.showAdded(to: (UIApplication.shared.keyWindow?.subviews.last)!, animated: true) 
       loadingNotification.mode = self.mode 
       loadingNotification.label.text = self.label.text 
      } else { 
       MBProgressHUD.hide(for: (UIApplication.shared.keyWindow?.subviews.last)!, animated: true) 
      } 
     case .error(let error): 
      let error = "Binding error to UI: \(error)" 
      print(error) 
     case .completed: 
      break 
     } 
     } 
    } 
    } 
+1

コードに説明を追加してください。 – evolutionxbox

関連する問題