我已经为此绞尽脑汁有一段时间了,我在管理一个需求时迷失了方向,我必须在kotlin中使用rx。
让我解释一下。
有一组ID,其等效项需要从服务器中删除,并最终根据服务器成功情况在本地删除。
基本上
进行网络呼叫以删除单个 id
(支持的网络调用返回 Completable
)
如果 complete
(成功)在存储区收到回调 id
在一个 list
(内存)
做第一步和第二步 id
删除
每次网络调用完成后,传递要从本地数据库中删除的列表
所以这些函数是可用的,不能修改。
fun deleteId(id: String): Completable { networkCall.deleteId(id) } fun deleteIds(ids: List<String>): Unit { localDb.deleteId(ids) }
这是我尝试过的,但显然是不完整和卡住。。。
val deleted = CopyOnWriteArrayList<String>()
val error = CopyOnWriteArrayList<String>()
items?.filter { it.isChecked }
?.map { Pair(it.id, dataManager.deleteId(it.id)) }
?.forEach { (Id, deleteOp) ->
deleteOp.subscribeOn(Schedulers.io())
.subscribe(object: CompletableObserver {
override fun onComplete() { deleted.add(Id) }
override fun onSubscribe(d: Disposable) { disposableManager += d }
override fun onError(e: Throwable) { error.add(Id) }
})
}
所以现在这里有多个问题,其中之一是我无法找到一个地方来知道所有请求都已完成,以便启动localdb delete。
有什么办法可以用吗 Flowable.fromIterable()
或者 zip
或者 merge
以某种方式遵循上述命令链来实现上述场景?
1条答案
按热度按时间kwvwclae1#
如果我正确理解了您的用例,那么应该这样做: