如何过滤combineLatest仅在一项更改时触发?

Sam*_*ikh 3 filter swift rx-swift combinelatest

我编写了如下小演示代码。我做了两个不同类型的PublishSubject。当我更改任何页面触发器时,仅当observable_page发生更改时,我才需要获取页面触发器。

class ViewController: UIViewController {

    func loadData(page: Int, keyword: String) -> Observable<[Int]> {
        let _result = Observable.of([1,2,3,4])
        return _result
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let observable_keyword = PublishSubject<String>()
        let observable_page = PublishSubject<Int>()
        let trigger_tap = PublishSubject<Void>()

        let tapObservable = trigger_tap.debug("trigger_tap", trimOutput: true)
        let stringObservable = observable_keyword.debug("stringObservable", trimOutput: true)
        let pageObservable = observable_page.debug("pageObservable", trimOutput: true)

        let request_call_trigger = Observable.combineLatest(tapObservable, pageObservable)
            .debug("request_call_trigger", trimOutput: true)

        let page = request_call_trigger
            .withLatestFrom(stringObservable) { ($0, $1) }
            .flatMap { ((_, _, page), keyword) in
                Observable.combineLatest(Observable.just(page), self.loadData(page: page, keyword: keyword)) { (pageNumber: $0, movies: $1) }
                    .materialize()
                    .filter { $0.isCompleted == false }
            }
            .share()

        observable_keyword.onNext("breaking bad")
        observable_page.onNext(1)

        trigger_tap.onNext(())

        observable_keyword.onNext("orange is new black")
        observable_keyword.onNext("orange")

    }

    let bag = DisposeBag()
}
Run Code Online (Sandbox Code Playgroud)

我读了一些选项,觉得过滤或忽略可能在这里起作用,但因为我需要它们在接下来的价值,所以很困惑,如何正确应用它。

Sha*_*ali 5

如果您正在寻找单个触发器,我认为您正在寻找的运算符是withLatestFrom

observable2
  .withLatestFrom(observable1)
Run Code Online (Sandbox Code Playgroud)

含义:仅当observable2发生变化时 - 获取其最新发射值以及 observable1 的最新发射值。

编辑:如果您想要这两个值,您可能需要提供resultsSelector

observable2
  .withLatestFrom(observable1) { ($0, $1) }
Run Code Online (Sandbox Code Playgroud)