【问题标题】:How to merge String & Int to get in ONE flatMap如何合并 String 和 Int 以进入 ONE flatMap
【发布时间】:2018-10-27 04:36:09
【问题描述】:
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,但显示为输入,

那么如何在一个 flatMap 中获取两个值

【问题讨论】:

    标签: swift merge rx-swift flatmap


    【解决方案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()
    

    【讨论】:

    • 这里的关键字是 let 关键字:Observable 并结合最新带来的 Observable,我应该把它改成简单的 String 吗?\
    • 不让它成为 Observable
    • 成功了。但它从未触发,因为我从 UI 传递关键字并且没有 INIT 方法。
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多