如何合并String和Int以获取一个flatMap

时间:2018-10-26 20:07:31

标签: swift merge rx-swift flatmap

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

开始保留页码,&关键字保留搜索关键字。

我需要合并两者,我确实使用了ENUM&Merge,

现在我必须调用API,但显示为Input

所以我如何在一个flatMap中获得两个值

1 个答案:

答案 0 :(得分:1)

摆脱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()