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 }
- Добавить кнопку в конце представления коллекции в раскадровке
- iOS - виджет расширения для домена со временем
- Как изменить цвет рамки SearchBar
- Обработка данных полезной нагрузки push-уведомлений
- Xcode пытается сопоставить идентификатор пакета фреймворков при загрузке приложения iOS в App Store
- Автоматическое добавление кнопок в панель инструментов
- iOS 11 останавливает поведение по умолчанию для swipe UITableViewCell
- Изменение фона текстового поля UISearchBar
- добавление ограничения в подвью делает фоновый цвет не отображен
- Остановить навигационный контроллер от влияния на другие контроллеры View
- UIGestureRecognizer с закрытием
- Изменения анимации во время вращения устройства на основе элемента размера будут после завершения вращения
- Как проверить Swift, если регулярное выражение действительно?
Вы можете использовать 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 } } } }