我对如何在RxJava中实现这一点感到困惑。 我想
我知道如何通过首先从数据库中加载所有对象并创建一个Observable
这样的Observable.fromIterable(allMyDbObjects)
来做到这一点,但是如果数据库的话,我想一次获取一个对象我上载时已更新。
我不知道该怎么做。我看过repeatUntil
,但它似乎可以立即重复。这是我在想的伪代码:
getFirstDbObject()
.flatMapCompletable { obj ->
upload(obj)
.doOnComplete {
deleteFromDb(obj)
}
}
.repeatUntil {
// dbIsEmptyLogic.
// This doesn't work. I need to somehow call getFirstDbObject() again
}
有人可以帮忙吗?
答案 0 :(得分:1)
这是我代码库中的可行解决方案。
val source = HashSet<String>()
source.add("a")
source.add("b")
source.add("c")
source.add("d")
source.add("e")
io.reactivex.Observable.just(Unit)
.flatMap { it ->
io.reactivex.Observable.fromCallable {
println("first flatmap print $it")
// uploadObj()
source.first()
}
}.flatMap {
// delete
io.reactivex.Observable.fromCallable {
source.remove(it)
println("second flatmap remove $it")
// delete object
}
}
.repeatUntil { source.isEmpty() }
.subscribe()
答案 1 :(得分:1)
假设getFirstDbObject()
返回Maybe,可以通过将结果映射到布尔值(如果数据库为空,则为true
,如果不是,则为false
),然后重复该序列直到getFirstDbObject()
返回空,流完成。
getFirstDbObject()
.toObservable()
.flatMapSingle { obj ->
upload(obj)
.doOnComplete { deleteFromDb(obj) } // probably better to use .andThen(deleteFromDb(obj)) if delete also returns a completable
.toSingleDefault(false)
}
.defaultIfEmpty(true)
.repeat()
.takeUntil { isComplete ->
isComplete
}