Rxswift – как показать индикатор выполнения

Мне нужно показать индикатор выполнения при вызове API и скрыть его после завершения вызова API. Ниже приведен код, который я написал для заполнения таблицы. Где я должен делать вызовы, чтобы показывать и скрывать прогресс для вызываемого API? Есть ли способ RxSwift сделать это?

 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 } 

Вы можете использовать ActivityIndicator из репозитория RxSwift . Я использую 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 } } } } 

Затем вам нужно создать объект ActivityIndicator в вашем классе ViewController:

 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) 

Вы выполняете эту работу в своем ViewController, примерно так:

 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) 

Swift 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 } } } } 
  • POST-массив объектов в методе POST Alamofire - Swift / IOS
  • Возврат кортежа из делегата (значение необязательного типа, не развернутого)
  • Swift: ошибка Apple Mach-O Linker (файл слишком мал для архитектуры x86_64)
  • UITableView с MVVM с использованием Swift
  • Как я могу запрашивать геопостановки Firebase без GeoFire, чтобы возвращать результаты на основе расстояния между двумя точками?
  • Сбой динамического переноса Swift с запросом HTTP GET
  • URLComponents.url - ноль
  • Инициализаторы RealmSwift - исправление Xcode - он продолжает ошибаться
  • Swift - анимация заливки цвета
  • iOS - Swift 3 Share Предварительный просмотр изображения
  • «DayCalendarUnit устарел. Вместо этого использовать NSCalendarUnitDay 'не работает
  • Interesting Posts

    Многопоточное приложение Core Data

    Почему я могу только изменить местоположение геокода, находящееся внутри Китая?

    Как записывать только человеческий голос и избегать bg-шума с помощью AVAudioRecorder

    Как сделать Custom Fonts во время разработки в Xcode 6?

    Горячие клавиши в iOS?

    NSCoding NSMutableDictionaries, содержащий пользовательские объекты

    Добавить раздел CDATA в существующей XML-строке в Swift 3.0 / ObjectiveC

    Apple Watch, несколько целей и общие целевые приложения Watchkit Extension / Watckit

    Событие Phonegap deviceready запускается только тогда, когда приложение теряет фокус

    IO напрямую воспроизводят исходное аудио из UDP-потока (NSData)

    vimeo iframe для IOS, как скрыть «как» и «поделиться» с правой стороны UIWebView

    RxSwift: код работает только в первый раз

    Приложения Xamarin iOS раздуты необоснованно?

    Хотите отображать собственное событие / расписание в календаре без отражения в собственном календаре в IOS (iPhone и iPad)

    UIDocument никогда не вызывает dealloc

    Давайте будем гением компьютера.