Как отобразить прогресс для комплекса Observable? - PullRequest
0 голосов
/ 31 марта 2019

Интересно, как отобразить прогресс для комплекса 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 Ответ

1 голос
/ 01 апреля 2019

Мне нравится, как Крунослав Захер реализует 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) }

Я не знаю, подходит ли это вашей ситуации, но, по крайней мере, она отделяет вашу логику прогресса от наблюдаемой операции.

...