RxSwift Использование оператора withLatestFrom с несколькими источниками - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 3 наблюдаемых, а именно источник, источник1 и источник2. Я хочу, чтобы всякий раз, когда источник генерирует отдельное событие, получаю значение source1 и source2. Это код, который я придумал, очевидно, он не будет компилироваться, поскольку withLatestFrom ожидает только одного наблюдаемого.

source.distinctUntilChanged()
        .withLatestFrom(source1, source2) { ($0, $1.0, $1.1) }
        .subscribe(onNext: { (A, B, C) in
            print("OnNext called")
        })
        .disposed(by: bag)

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вы почти получили это. Как насчет того, чтобы просто объединить source1 и source2?

source.distinctUntilChanged()
    .withLatestFrom(Observable.combineLatest(source1, source2)) { ($0, $1.0, $1.1) }
    .subscribe(onNext: { (A, B, C) in
        print("OnNext called")
    })
    .disposed(by: bag)
0 голосов
/ 18 июня 2020

Вы можете сделать что-то вроде этого

        let source = PublishSubject<Int>()
        let source1 = PublishSubject<Int>()
        let source2 = PublishSubject<Int>()

        Observable
            .combineLatest([source,source1,source2])
            .distinctUntilChanged { (oldArray, newArray) -> Bool in
                return oldArray.first == newArray.first
            }
            .subscribe(onNext: { (values) in
                debugPrint("source1 value is \(values[1]) and source2 value is \(values[2])")
            })
            .disposed(by: self.disposeBag)

        source1.onNext(100)
        source2.onNext(200)
        source.onNext(3)

        source.onNext(4)
        source.onNext(4)

O / P будет выглядеть как enter image description here

Catch:

Я использую combineLatest, что означает, что это будет работать только после того, как все наблюдаемые испускают значения хотя бы один раз. Вы всегда можете использовать оператор startWith, чтобы убедиться, что все ваши наблюдаемые излучают значение хотя бы один раз.

...