从单个可传递值传递可生成Android RxJava

时间:2019-03-23 21:40:19

标签: android rx-java2

这就是我想要的:

  
      
  1. 检查数据库中是否有关于产品的数据。
  2.   
  3. 如果我有数据,我将运行Single以从DB中获取数据。
  4.   
  5. 如果没有,我运行Single来从后端获取数据
  6.   
  7. 如果收到响应,我想使用Completable将数据保存在DB中。
  8.   
  9. 保存数据后,我想映射第2步或第3步中的值以查看模型
  10.   
  11. 结果,我想将数据发送到活动中。
  12.   

这就是我现在拥有的:

checkProductsInDBUseCase.run()
                .flatMap {
                    if (it) {
                        getProductsFromDBUseCase.run()
                    } else {
                        getProductsUseCase.run(3)
                    }
                }.map {
                    it.products.map { item -> item.toViewModel() }
                }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeBy(
                        onSuccess = {
                            view.showBikes(it)
                        },
                        onError = {
                            view.showBikesError(it.message.toString())
                        }
                ).addTo(disposables)

在平面地图和地图之间,我需要运行saveDataUseCase(it),但我不知道如何从可填充地图传递it。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您的saveDataUseCase()是可完成的,那么您可以这样做

checkProductsInDBUseCase.run()
        .flatMap {
            if (it) {
                getProductsFromDBUseCase.run()
            } else {
                getProductsUseCase.run(3)
            }
        }
        .faltMap {
             saveDataUseCase(it).toSingleDefault(it)
        }
        .map {
            it.products.map { item -> item.toViewModel() }
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeBy(
                onSuccess = {
                    view.showBikes(it)
                },
                onError = {
                    view.showBikesError(it.message.toString())
                }
        ).addTo(disposables)

但是,如果将saveDataUseCase()的返回类型更改为Unit,则可以使用Fred的答案。会更好

答案 1 :(得分:0)

在这里,我将使用doOnSuccess。这似乎很理想,特别是因为您正在创建副作用,我们通常使用doOnXXX方法。

checkProductsInDBUseCase.run()
            .flatMap {
                if (it) {
                    getProductsFromDBUseCase.run()
                } else {
                    getProductsUseCase.run(3)
                }
            }
            .doOnSuccess {
                 saveDataUseCase(it)
            }
            .map {
                it.products.map { item -> item.toViewModel() }
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeBy(
                    onSuccess = {
                        view.showBikes(it)
                    },
                    onError = {
                        view.showBikesError(it.message.toString())
                    }
            ).addTo(disposables)

该方法不会更改flatMap的结果,因此您仍将在map函数内获得正确的对象。