这就是我想要的:
- 检查数据库中是否有关于产品的数据。
- 如果我有数据,我将运行Single以从DB中获取数据。
- 如果没有,我运行Single来从后端获取数据
- 如果收到响应,我想使用Completable将数据保存在DB中。
- 保存数据后,我想映射第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
。有什么想法吗?
答案 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
函数内获得正确的对象。