结合使用FlatMap和Completable

时间:2019-06-03 10:05:44

标签: kotlin rx-java

我试图多次调用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。从下载返回的数据是一个列表,我希望该列表在流中保留为列表。我不想发出单个列表项。

1 个答案:

答案 0 :(得分:0)

为了解决类型不匹配错误,请使用运算符flatMapCompletable代替flatMap

    .flatMapCompletable { connections -> App.context.repository.storeConnections(connections) }

然后,您将不得不使用doOnComplete而不是doOnNext

    .doOnComplete { startPos -> startPositions.onNext(startPos + 1) }