如何显示复杂Observable的进度?

时间:2019-03-30 22:48:49

标签: swift reactive-programming rx-swift

我想知道当我像这样使用Observable时如何显示复杂flatMap的进度:

Observable<Int>.from([1,2,3,4])
    .flatMap { queryApi($0) }
    .flatMap { queryApi2($0) }
    .flatMap { queryApi3($0) }

我当时正在考虑使用do运算符:

func longOperation() -> Observable<Progress> {

    return Observable.create { observer in
        observer.onNext(.step1)

        let operation = Observable<Int>.from([1,2,3,4])
            .flatMap { queryApi($0) }
            .do(onNext: { _ in observer.onNext(.step2) })
            .flatMap { queryApi2($0) }
            .do(onNext: { _ in observer.onNext(.step3) })
            .flatMap { queryApi3($0) }
            .do(onNext: { _ in observer.onNext(.finished) })
            .subscribe()

        return Disposables.create { operation.dispose() }
    }
}

但是,我不确定这是否是跟踪进度的最佳方法。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

我喜欢Krunoslav Zaher在RxSwift存储库的ActivityIndicator项目中实现RxExample的方式。

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) }

我不知道这是否适合您的情况,但至少它使您的进度逻辑与可观察的操作脱钩。