gpt4 book ai didi

android - RXKotlin中的存储库模式连接结果

转载 作者:行者123 更新时间:2023-12-02 13:31:34 25 4
gpt4 key购买 nike

尝试使用脱机优先应用程序时,我设法制作了一个有效的存储库模式,该模式首先检查缓存,然后检查数据库,最后检查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)

现在,问题是我将部分数据保存在数据库中(不是所有主题)。如果用户连接到Internet并浏览,则显示的数据将仅是数据库中的数据。但这不是用户应访问的所有内容(如果他们已连接到Internet)。我知道这是由于 .firstOrError()调用所致。

但我想知道是否有一种方法可以连接数据库+ api的不同结果(api可能会失败,因此返回0个结果)并返回Single。

编辑

更清楚地说,我想要以下内容:
IF CACHE IS NOT EMPTY
RETURN DISTINCT(DB + CACHE)
ELSE
UPDATE CACHE WITH API RESULT
RETURN DISTINCT(DB + API)

如果失败,API调用将自动导致没有结果。

最佳答案

也许您想要的是Maybe#switchIfEmpty(docs 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 }
}
)

关于android - RXKotlin中的存储库模式连接结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61201439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com