Как мне объединить несколько вариантов использования Asyn c в один? - PullRequest
0 голосов
/ 02 мая 2020

Я занимаюсь рефакторингом частей нашего кода и чувствую себя неуверенно из-за своих аргументов в пользу конкретной проблемы c. Наши бизнес-требования следующие:

  • Мы должны вызывать 4 сетевых запроса отдельно от разных представлений.
  • Мы должны ждать 4 сетевых запросов до конца sh и запускают новый сетевой запрос .

Ранее все это было обработано в одном классе, который был разделен между 4 различными представлениями. Однако я не уверен, что мои рассуждения были правильными. Я сделал это следующим образом:

  1. Я бы инициализировал 4 субъекта воспроизведения для каждого сетевого запроса, чтобы отслеживать, когда сетевые запросы будут завершены. (Я знаю, что мог бы использовать RxRelay для этого вида логики c, но в настоящее время это не проблема для меня)

fun init(){
    firstTrigger : ReplaySubject<Boolean> = ReplaySubject.create()
    secondTrigger : ReplaySubject<Boolean> = ReplaySubject.create()
    thirdTrigger :  ReplaySubject<Boolean> = ReplaySubject.create()
    forthTrigger : ReplaySubject<Boolean> = ReplaySubject.create()
}

Вот пример кода одного из 4 сетевых запросов. Я провожу предмет после успеха.

fun networkRequestNrOne() { 
    firstObservable = apiService.networkRequestNrOne() 

    compositeDisposable.add(firstObservable
    .retryWhenError(5, 1)
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe({ 
        success -> first.onNext(true) }, 
        { throwable -> handleError(throwable) })
    ) 
}

Тогда у меня есть метод, который вызывается в init этого класса. Он использует zip-оператор из Rx Java, чтобы объединить все сетевые запросы

fun observeWhenToFire(): Observable<Boolean> {
        return Observable.zip(firstTrigger, secondTrigger, thirdTrigger,
                forthTrigger,
                Function4<Boolean, Boolean, Boolean, Boolean, Boolean> { first, second, third,
                forth ->
                    //handle checking if all are true for example.
                })
    }

Теперь я хотел бы реорганизовать его и создать 4 различные UseCase для таких случаев и новый UseCase, который будет включать все 4 UseCases и возвращать объединенный ответ.

Однако мне все равно придется использовать Rx Subjects для обработки такого сценария. Каждый UseCase будет принимать субъект, связанный с этим UseCase , в качестве параметра , тогда как UseCase, , который объединяет все другие UseCases, будет включать 4 * 1 субъекта .

Есть ли лучший способ? Я даже думал об использовании обычных обратных вызовов, и это может быть еще более читаемый код. Я также использую сопрограммы, но на этот раз я не хочу рефакторировать этот лог c в сопрограммы из-за нашего c ustom retryWhenError расширения , которое является совершенно уникальным:)

1 Ответ

0 голосов
/ 03 мая 2020

Не знаю, действительно ли я получу ваш вопрос, но это может вам помочь.

 Completable.merge(
            listOf(
                usecase1.ignoreElement(),
                usecase2.ignoreElement(),
                usecase3.ignoreElement(),
                usecase4.ignoreElement()
            )
        ).andThen(useCase5.ignoreElement())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnComplete { handleSuccess() }
            .doOnError { handleError(it) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...