这就是我想要的:
- 检查数据库中是否有有关产品的数据。
- 如果我有数据,我会运行 Single 从数据库获取数据。
- 如果没有,我运行 Single 从后端获取数据
- 如果我得到响应,我想使用 Completable 将数据保存在数据库中。
- 保存数据后,我想将步骤 2 或 3 中的值映射到查看模型
- 结果我想将数据发送到活动。
这就是我现在拥有的:
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
从完成传递到地图。有什么想法吗?
如果你的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 的答案。会更好
在这里我会使用 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
函数中获得正确的对象。