重复请求 X 次或直到返回 Y 项

Repeat a request X number of times or till Y items is returned

我在创建具有以下条件的 Observable 时遇到了问题:

  1. 从 API 中获取项目。 API 可以 return 0 到 10 个项目。
  2. 如果 return 编辑的项目少于 10 个,请从 API 请求更多项目。
  3. 重复 5 次或直到收集到 10 件或更多物品。

到目前为止我有这个 Observable:

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

这个工作正常,有一点挑剔。如果 API returns 9 项然后 10 项,Observable returns 10 项。剩下的 9 个被丢弃,我不希望这样。有什么办法让它那样工作吗?

将其收集到跨多个步骤共享的列表中并执行有条件的重复:

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))
}