我有以下代码
class CurrencyRepository @Inject constructor(val apiInterface: ApiInterface,
val ratesDao: RatesDao) {
fun getRates(): Observable<List<Rates>> {
val observableFromApi = getCurrencyFromApi()
val observableFromDb = getRatesFromDb()
return Observable.concatArrayEager(observableFromApi , observableFromDb)
}
private fun getCurrencyFromApi(): Observable<Currency> {
return apiInterface.getRates()
.doOnNext {
Timber.i(it.toString())
val map = it.rates
val keys = map.keys
for (key in keys) {
ratesDao.insertRate(Rates(key , map.get(key)))
}
}
}
private fun getRatesFromDb(): Observable<List<Rates>> {
return ratesDao.getAllRates()
.toObservable()
.doOnNext {
for (rate in it) {
Timber.i("Repository DB ${it.size}")
}
}
}
}
在getCurrencyFromApi()
中,getRates()
向我返回了Observable<Currency>
。我希望该特定函数返回Observable<List<Rates>>
,以便可以在Observable.concatArrayEager
的{{1}}内的getRates()
中使用它
货币包含一个Map对象,可以将其转换为List对象。我不清楚如何在CurrencyRepository
答案 0 :(得分:3)
一种可能的解决方案是
fun getRatesFromApi(): Observable<List<Rates>> {
return apiInterface.getRates()
.flatMapIterable { it.rates.entries }
.map { Rates(it.key ,it.value) }
.doOnNext { ratesDao.insertRate(it) }
.toList()
.toObservable()
}
我建议您分批在数据库中插入项目,因为这样会更有效。