我试图多次调用API,并传入另一个参数。当没有更多数据返回时,rx流应终止。每次调用后,数据都存储在我的本地存储库中。这是我所拥有的:
val startPositions = BehaviorSubject.createDefault(0)
startPositions.flatMap { startPos -> App.context.repository.getConnections(startPos) }
.flatMap { connections -> App.context.repository.storeConnections(connections) }
.doOnNext { startPos -> startPositions.onNext(startPos + 1) }
.subscribe({ startPos -> println("Index $startPos") })
这是处理数据下载的api方法:
override fun getConnections(startPos: Int): Observable<List<Connection>> {
return myAPI.getConnections(startPos)
}
这是用于存储数据的api方法:
override fun storeConnections(connections: List<Connection>): Completable =
Completable.fromAction {
appDao.storeConnections(connections.map {
mapper.toDb(it)
})
}
我得到的编译错误是:
类型不匹配:推断的类型为(列表)->可完成,但((列表)-> ObservableSource!)!是预期的
如果可能,我不想更改api调用的返回类型。我也不确定要使用flatMap。从下载返回的数据是一个列表,我希望该列表在流中保留为列表。我不想发出单个列表项。
答案 0 :(得分:0)
为了解决类型不匹配错误,请使用运算符flatMapCompletable
代替flatMap
:
.flatMapCompletable { connections -> App.context.repository.storeConnections(connections) }
然后,您将不得不使用doOnComplete
而不是doOnNext
:
.doOnComplete { startPos -> startPositions.onNext(startPos + 1) }