Мне нравится, как Крунослав Захер реализует ActivityIndicator
в RxExample
проекте в репозитории RxSwift.
https://github.com/ReactiveX/RxSwift/blob/2e64568/RxExample/RxExample/Services/ActivityIndicator.swift
Использование:
let activityIndicator = ActivityIndicator()
let state = githubSearchRepositories(
searchText: searchBar.rx.text.orEmpty.changed.asSignal().throttle(0.3),
loadNextPageTrigger: loadNextPageTrigger,
performSearch: { URL in
GitHubSearchRepositoriesAPI.sharedAPI.loadSearchURL(URL)
.trackActivity(activityIndicator)
})
Итакв вашем случае вы можете реализовать другую наблюдаемую информацию, аналогичную ActivityIndicator
let operationProgress = OperationProgress<Progress>()
Observable<Int>.from([1,2,3,4])
.flatMap { queryApi($0).updateProgress(operationProgress, to: .step1) }
.flatMap { queryApi2($0).updateProgress(operationProgress, to: .step2) }
.flatMap { queryApi3($0).updateProgress(operationProgress, to: .step3) }
Я не знаю, подходит ли это вашей ситуации, но, по крайней мере, она отделяет вашу логику прогресса от наблюдаемой операции.