Повторите запрос X раз или до тех пор, пока не будет возвращено Y элементов

У меня возникли проблемы с созданием Observable со следующими условиями:

  1. Получить элементы из API. API может возвращать от 0 до 10 элементов.
  2. Если возвращается менее 10 элементов, запросите дополнительные элементы из API.
  3. Повторите 5 раз или пока не соберете 10 или более предметов.

Пока у меня есть этот Observable:

fetchData().flatMapIterable { dataList }
            .distinct()
            .filter { --some filtering--- }
            .repeat(5)
            .take(10)
            .toList()

Это работает нормально, с одной придиркой. Если API возвращает 9 элементов, а затем 10 элементов, Observable возвращает 10 элементов. Остальные 9 отбрасываются, а я этого не хочу. Любой способ заставить это работать таким образом?

1
0
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Соберите его в список, разделенный на несколько шагов, и выполните условный повтор:

Single.defer {
    var list = ArrayList<T>()
    var count = AtomicInteger()

    fetchData()
    .flatMapIterable { dataList }
    .distinct()
    .filter { --some filtering--- }
    .collectInto(list, { list, item -> list.add(item) })
    .repeatUntil { list.size() >= 10 || count.getAndIncrement() > 4 }
    .ignoreElements()
    .andThen(Single.just(list))
}

Ах хорошо. Я уже пробовал что-то в этом роде, но мне не нравился отдельный список и подсчет вне потока.

Tomislav Turcic 14.12.2020 16:53

Другие вопросы по теме