Как реализовать Recursive Paginated Network Call с использованием RxSwift - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть конечная точка, которая возвращает элементы текущей страницы. Кроме того, если вы хотите получить элементы следующей страницы, вы должны создать URL-адрес со следующей страницей: ha sh. Это ha sh возвращается как свойство в ответе на предыдущий запрос. Как вы понимаете, нам нужен рекурсивный сетевой вызов.

Когда запрос завершится, новый запрос начнется до тех пор, пока ha sh не возвратит ноль через ответ.

Затем мне нужно связать все собранные данные в массив.

Как я могу построить что-то подобное в RxSwift? Буду признателен, если вы опишите эту концепцию.

1 Ответ

0 голосов
/ 15 февраля 2020

Вам нужно что-то вроде этого: https://gist.github.com/danielt1263/ec1032375498eb95aa260239b289d263

/**
 Calls `producer` with `seed` then emits result and also passes it to `pred`. Will continue to call `producer` with new values as long as `pred` returns values.
 - parameter seed: The starting value needed for the first producer call.
 - parameter pred: This closure determines what the next value pass into producer should be or returns nil if no more calls are necessary.
 - parameter producer: The function that produces the Single result.
 - returns: An observable that emits each producer's value.
 */
func emitWhile<T, U>(seed: U, pred: @escaping (T) -> U?, producer: @escaping (U) -> Single<T>) -> Observable<T>

seed - это га sh для первой страницы. pred берет результат сетевого запроса, извлекает ha sh для следующей страницы и возвращает его (или возвращает ноль, если следующей страницы нет.) producer берет ha sh и возвращает Наблюдаемый, который сделает запрос на страницу, когда она подписана.

Вы, вероятно, захотите собрать все элементы, используя либо сканирование, либо уменьшение, чтобы испустить все страницы как один массив.

...