RXKotlin 中的存储库模式串联结果
Repository pattern concatenating results in RXKotlin
尝试使用离线优先的应用程序,我设法制作了一个工作存储库模式,首先检查缓存,然后是数据库,最后是 api。我这样做:
private fun cachedTopics(): Maybe<List<Topic>> { ... }
private fun databaseTopics(): Maybe<List<Topic>> { ... }
private fun apiTopics(): Maybe<List<Topic>> { ... }
Maybe.concat(cachedTopics(), databaseTopics(), apiTopics())
.firstOrError()
.subscribeOn(scheduler)
现在,问题是我在数据库中保存了部分数据(不是所有主题)。如果用户连接到互联网并浏览,则显示的数据将只是数据库中的数据。但这并不是用户应该访问的所有内容(如果他们连接到互联网)。我知道这是由于 .firstOrError()
调用造成的。
但我想知道是否有一种方法可以连接数据库 + api 的不同结果(api 可能会失败,因此 return 0 个结果)和return 单曲.
编辑
为了更清楚,我想要如下内容:
IF CACHE IS NOT EMPTY
RETURN DISTINCT(DB + CACHE)
ELSE
UPDATE CACHE WITH API RESULT
RETURN DISTINCT(DB + API)
其中 API 调用将自动导致 having nor 结果,如果失败。
也许你想要的是Maybe#switchIfEmpty
(文档here)
那么你可以这样做:
class Repository() {
fun topics() {
return cachedTopics.switchIfEmpty(databaseOrApiTopics());
}
private fun databaseOrApiTopics() = databaseTopics().switchIfEmpty(apiTopicsWithUpdate())
private fun apiTopicsWithUpdate() = apiTopics().doOnComplete {
// update db
// update cache?
}
}
更新:如果你想将结果组合在一起,你可以使用带有组合器的 Maybe.flatMap
的重载来实现。类似于:
cachedTopics().switchIfEmpty(
databaseTopics().flatMap { dbTopics ->
apiTopics().doOnComplete { /* updateDb(it) */ }
.map { apiTopics -> apiTopics + dbTopics }
}
)
尝试使用离线优先的应用程序,我设法制作了一个工作存储库模式,首先检查缓存,然后是数据库,最后是 api。我这样做:
private fun cachedTopics(): Maybe<List<Topic>> { ... }
private fun databaseTopics(): Maybe<List<Topic>> { ... }
private fun apiTopics(): Maybe<List<Topic>> { ... }
Maybe.concat(cachedTopics(), databaseTopics(), apiTopics())
.firstOrError()
.subscribeOn(scheduler)
现在,问题是我在数据库中保存了部分数据(不是所有主题)。如果用户连接到互联网并浏览,则显示的数据将只是数据库中的数据。但这并不是用户应该访问的所有内容(如果他们连接到互联网)。我知道这是由于 .firstOrError()
调用造成的。
但我想知道是否有一种方法可以连接数据库 + api 的不同结果(api 可能会失败,因此 return 0 个结果)和return 单曲.
编辑
为了更清楚,我想要如下内容:
IF CACHE IS NOT EMPTY
RETURN DISTINCT(DB + CACHE)
ELSE
UPDATE CACHE WITH API RESULT
RETURN DISTINCT(DB + API)
其中 API 调用将自动导致 having nor 结果,如果失败。
也许你想要的是Maybe#switchIfEmpty
(文档here)
那么你可以这样做:
class Repository() {
fun topics() {
return cachedTopics.switchIfEmpty(databaseOrApiTopics());
}
private fun databaseOrApiTopics() = databaseTopics().switchIfEmpty(apiTopicsWithUpdate())
private fun apiTopicsWithUpdate() = apiTopics().doOnComplete {
// update db
// update cache?
}
}
更新:如果你想将结果组合在一起,你可以使用带有组合器的 Maybe.flatMap
的重载来实现。类似于:
cachedTopics().switchIfEmpty(
databaseTopics().flatMap { dbTopics ->
apiTopics().doOnComplete { /* updateDb(it) */ }
.map { apiTopics -> apiTopics + dbTopics }
}
)