将多个不同的 observable 组合成一个 observable

Combining multiple different observables into one observable

我在将 RxSwift 应用到我的应用程序时遇到了问题。我的问题是: 如果我有许多可以由用户更改的输入信号(具有不同元素的变量),并且我想根据这些更改构建一个 Observable 信号。我想我应该使用某种组合运算符,但例如 combineLatest 只允许两个参数组合。

让我们看一下我拥有的输入和输出示例。

import RxSwift
import RxCocoa

class ModelView {

    private let api: ApiType

    // inputs
    let inType: Variable<MWItemQueryType>
    let inFilterRetailers: Variable<Set<MWRetailer>>
    let inFilterColors: Variable<Set<MWColor>>
    let inFilterPriceRanges: Variable<Set<MWPriceRange>>

    // outputs
    let outQuery: Observable<MWItemQuery>

    init(initialType: MWItemQueryType, api: ApiType) {
        self.api = api
        self.inType = Variable(initialType)
        self.inFilterRetailers = Variable(Set<MWRetailer>())
        self.inFilterColors = Variable(Set<MWColor>())
        self.inFilterPriceRanges = Variable(Set<MWPriceRange>())

        // TODO How to setup outQuery signal here
    }
}

所以我在设置发出信号的 outQuery 时遇到问题 MWItemQuery。当其中一个输入参数更改时,必须发出 MWItemQuery 信号。然后将 MWItemQuery 发送到 api 以使用用户选择的最新过滤器从服务器获取数据。我还有很多其他的输入滤波信号,不知道有没有哪位运营商能帮帮我。

可以使用combineLatest运算符,它可以合并2..8observables。 有不同版本取不同数量的observables.

combineLatest可以接受2个以上的参数!

尝试:

Observable.combineLatest(inType.asObservable(), inFilterRetailers.asObservable(), inFilterColors.asObservable(), inFilterPriceRanges.asObservable())
    { type, filterRetailers, filterColors, filterPriceRanges in 
        // do something with your data
    }
    .distinctUntilChanged()
    .shareReplay(1)