Как вызвать emitter.onComplete (), когда emitter.onNext () находятся в асинхронном цикле - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть вызов Async, в котором слушатель обратного вызова я поместил emitter.onNext (). Этот асинхронный вызов находится внутри for-in (я знаю размер списка). Я хотел бы вызвать onComplete (), когда последний элемент был передан в onNext ().

for (anItem in itemList) {

     eventsQuery.get()
           .addOnCompleteListener { task ->
               if (task.isComplete) {

                    emitter.onNext(myItemFromTask)

                    if(count == itemList.size){
                         emitter.onComplete()
                    }
                }
           }
 }

Счет, так как это асинхронный вызов, не увеличивается должным образом, и onComplete () никогда не вызывается.

Как правильно обращаться с этой ситуацией? Мне нужно, чтобы onComplete показывал вид и удалял строку загрузки / прогресса.

1 Ответ

0 голосов
/ 03 сентября 2018

Я нашел решение.

Использование AtomicInteger, например:

 var counter = AtomicInteger(0)
 for (anItem in itemList) {

   eventsQuery.get()
        .addOnCompleteListener { task ->
            if (task.isComplete) {

                counter.incrementAndGet()
                emitter.onNext(myItemFromTask)

                if(counter == itemList.size){
                      emitter.onComplete()
                }
            }
       }
}

Если кто-нибудь найдет лучшее или более элегантное решение, оно будет оценено!

...