我应该如何将多个Async UseCases合并成一个?

问题描述 投票:0回答:1

我正在对我们的部分代码进行重构,但对某一具体问题的推理感到不确定。我们的业务需求如下。

  • 我们必须从不同的视图中分别调用4个网络请求。
  • 我们必须等待4个网络请求 完成开通网络.

以前,所有这些都是在一个类中处理的,它是由4个不同的视图共享的。但是,我不确定我的推理是否正确。我是按以下方式做的。

  1. 我将初始化 4个重播科目 来跟踪每个网络请求何时完成。我知道我可以使用RxRelay来实现这种逻辑,但目前对我来说这不是一个问题

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

  1. 下面是一个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) })
    ) 
}

  1. 然后我有一个方法,它在这个类的init中被调用。它使用RxJava中的zip操作符来合并所有的网络请求。

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个UseCase并返回一个合并的响应。

然而,我仍然需要使用Rx Subjects来处理这种情况。每个UseCase都会取一个与该UseCase绑定的主题 作为参数,而UseCase。的拉链,其他所有的 用例,将 包括4*1科目.

有什么更好的方法吗?我甚至想到了使用常规回调,这可能是更易读的代码。 我确实也使用了coroutines,然而这次我不想把这个逻辑重构成coroutines,因为我们的custom retryWhenError扩展名这是很独特的:)

rx-java2 android-mvvm clean-architecture
1个回答
0
投票

我不知道我是否真的明白你的问题,但这可能会帮助你。

 Completable.merge(
            listOf(
                usecase1.ignoreElement(),
                usecase2.ignoreElement(),
                usecase3.ignoreElement(),
                usecase4.ignoreElement()
            )
        ).andThen(useCase5.ignoreElement())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnComplete { handleSuccess() }
            .doOnError { handleError(it) }
© www.soinside.com 2019 - 2024. All rights reserved.