如何显示复杂 Observable 的进度?
How to display progress for complex Observable?
我想知道当我像这样使用 flatMap
时如何显示复杂 Observable
的进度:
Observable<Int>.from([1,2,3,4])
.flatMap { queryApi([=10=]) }
.flatMap { queryApi2([=10=]) }
.flatMap { queryApi3([=10=]) }
我正在考虑使用 do
运算符:
func longOperation() -> Observable<Progress> {
return Observable.create { observer in
observer.onNext(.step1)
let operation = Observable<Int>.from([1,2,3,4])
.flatMap { queryApi([=11=]) }
.do(onNext: { _ in observer.onNext(.step2) })
.flatMap { queryApi2([=11=]) }
.do(onNext: { _ in observer.onNext(.step3) })
.flatMap { queryApi3([=11=]) }
.do(onNext: { _ in observer.onNext(.finished) })
.subscribe()
return Disposables.create { operation.dispose() }
}
}
但是,我不确定这是否是跟踪进度的最佳方式。有没有更好的方法来处理这个问题?
我喜欢 Krunoslav Zaher 在 RxSwift 存储库的 RxExample
项目中实现 ActivityIndicator
的方式。
用法:
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([=11=]).updateProgress(operationProgress, to: .step1) }
.flatMap { queryApi2([=11=]).updateProgress(operationProgress, to: .step2) }
.flatMap { queryApi3([=11=]).updateProgress(operationProgress, to: .step3) }
我不知道这是否适合您的情况,但至少它可以将您的进度逻辑与可观察操作分离。
我想知道当我像这样使用 flatMap
时如何显示复杂 Observable
的进度:
Observable<Int>.from([1,2,3,4])
.flatMap { queryApi([=10=]) }
.flatMap { queryApi2([=10=]) }
.flatMap { queryApi3([=10=]) }
我正在考虑使用 do
运算符:
func longOperation() -> Observable<Progress> {
return Observable.create { observer in
observer.onNext(.step1)
let operation = Observable<Int>.from([1,2,3,4])
.flatMap { queryApi([=11=]) }
.do(onNext: { _ in observer.onNext(.step2) })
.flatMap { queryApi2([=11=]) }
.do(onNext: { _ in observer.onNext(.step3) })
.flatMap { queryApi3([=11=]) }
.do(onNext: { _ in observer.onNext(.finished) })
.subscribe()
return Disposables.create { operation.dispose() }
}
}
但是,我不确定这是否是跟踪进度的最佳方式。有没有更好的方法来处理这个问题?
我喜欢 Krunoslav Zaher 在 RxSwift 存储库的 RxExample
项目中实现 ActivityIndicator
的方式。
用法:
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([=11=]).updateProgress(operationProgress, to: .step1) }
.flatMap { queryApi2([=11=]).updateProgress(operationProgress, to: .step2) }
.flatMap { queryApi3([=11=]).updateProgress(operationProgress, to: .step3) }
我不知道这是否适合您的情况,但至少它可以将您的进度逻辑与可观察操作分离。