Я занимаюсь рефакторингом частей нашего кода и чувствую себя неуверенно из-за своих аргументов в пользу конкретной проблемы c. Наши бизнес-требования следующие:
- Мы должны вызывать 4 сетевых запроса отдельно от разных представлений.
- Мы должны ждать 4 сетевых запросов до конца sh и запускают новый сетевой запрос .
Ранее все это было обработано в одном классе, который был разделен между 4 различными представлениями. Однако я не уверен, что мои рассуждения были правильными. Я сделал это следующим образом:
- Я бы инициализировал 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 расширения , которое является совершенно уникальным:)