1

在以下条件下创建 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 个被丢弃,我不希望这样。有什么办法让它这样工作吗?

4

1 回答 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))
}
于 2020-12-14T15:14:54.973 回答