将多个不同的可观察量组合成一个可观察量

时间:2017-07-28 13:19:53

标签: swift3 reactive-programming rx-swift

我在将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
    }
}

所以我遇到了发出信号MWItemQuery的setup outQuery的问题。当其中一个输入参数发生变化时,必须发出MWItemQuery信号。然后将MWItemQuery发送到api以从服务器获取数据,并使用用户选择的最新过滤器。我有很多其他输入滤波器信号,我不知道是否有任何操作员可以帮助我。

2 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:0)

您可以使用combineLatest运算符,它可以组合2..8 myList.index(ans) 。 有不同的版本可以使用不同数量的observables