Некоторое время я ломал голову над этим, я потерялся здесь в управлении требованием, когда я должен использовать Rx в Котлине.
Позволь мне объяснить.
Существует набор идентификаторов, эквивалентные элементы которых должны быть удалены с сервера и, в конечном итоге, локально в зависимости от успеха сервера.
В принципе
- Сделать сетевой вызов для удаления одного
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.
Есть ли способ, где я могу использовать Flowable.fromIterable()
или zip
или merge
каким-то образом, следуя цепочке команд, как указано выше, для достижения вышеуказанного сценария?