Как объединить String & Int, чтобы попасть в ОДИН flatMap - PullRequest
0 голосов
/ 26 октября 2018
enum Input { case text(String); case page(Int) }

Я управляю разбиением на страницы с помощью поиска по ключевым словам в методе API. Теперь я могу передать ключевые слова или номер страницы, но не оба одновременно в Rx.

Я написал следующий код с помощью некоторых существующих доступных

    let start = Observable.merge(reload, loadNext)

    let stringObservable = keyword.asObservable().map { Input.text($0) }
    let intObservable = start.asObservable().map { Input.page($0) }

    let request_call = Observable.of(stringObservable, intObservable).merge()
    let page = request_call
        .flatMap { input in
            Observable.combineLatest(Observable.just($0), api.loadData(page: $0, keyword: "breaking")) { (pageNumber: $0, items: $1) }
                .materialize()
                .filter { $0.isCompleted == false }
        }
        .share()

start keep Number Page, а ключевое слово сохраняет ключевые слова для поиска.

Мне нужно объединить оба, я использовал ENUM & Merge,

Теперь я должен вызвать API, но в качестве ввода отображается

Так как я могу получить оба значения в одной flatMap

1 Ответ

0 голосов
/ 26 октября 2018

Избавьтесь от перечисления Input и используйте combineLatest вместо слияния.

Тогда request_call будет Observable<(String, Int)>, и вы можете использовать два значения в функции loadData.

let start = Observable.merge(reload, loadNext)

let stringObservable = keyword.asObservable()
let intObservable = start.asObservable()

let request_call = Observable.combineLatest(stringObservable, intObservable)
let page = request_call
    .flatMap { text, page in
        Observable.combineLatest(Observable.just(page), api.loadData(page: page, keyword: text)) { (pageNumber: $0, items: $1) }
            .materialize()
            .filter { $0.isCompleted == false }
    }
    .share()
...