12

我正在使用 RxSwift 2.0.0-beta

如何以类似 zip 的方式组合 2 个不同类型的 observable?

// This works
[just(1), just(1)].zip { intElements in
    return intElements.count
}

// This doesn't
[just(1), just("one")].zip { differentTypeElements in 
    return differentTypeElements.count
}

我目前的解决方法是将所有内容映射到组合类型的可选元组,然后将可选元组压缩成非可选元组。

    let intObs = just(1)
        .map { int -> (int: Int?, string: String?) in
            return (int: int, string: nil)
    }
    let stringObs = just("string")
        .map { string -> (int: Int?, string: String?) in
        return (int: nil, string: string)
    }
    [intObs, stringObs].zip { (optionalPairs) -> (int: Int, string: String) in
        return (int: optionalPairs[0].int!, string: optionalPairs[1].string!)
    }

但这显然很丑陋。更好的方法是什么?

4

3 回答 3

22

这对我有用。我在 Xcode7 中测试过,RxSwift-2.0.0-beta

zip(just(1), just("!")) { (a, b) in 
    return (a,b)
}
于 2015-12-04T19:18:13.800 回答
8

这是使它适用于 RxSwift 2.3+ 的方法

Observable.zip(Observable.just(1), Observable.just("!")) {
    return ($0, $1)
}

或者

Observable.zip(Observable.just(1), Observable.just("!")) {
    return (anyName0: $0, anyName1: $1)
}
于 2016-04-11T15:53:34.260 回答
1

如果你使用 Singles (RxSwift 5.0+)

Single.zip(single1, single2) {
    return ($0, $1)
}

或者

Observable.zip(single1.asObservable(), single2.asObservable()) {
    return ($0, $1)
}

例子:

let task = Single
                .zip(repository.getArrayA(), repository.getArrayB())
                { (a: [A], b: [B]) in
                    return (a, b)
                }                    
                .do(onSuccess: { (zip) in
                let (a, b) = zip

                // your code

                //example: self.updateSomething(a, b)

            })
            .asCompletable()
于 2020-03-30T20:21:58.680 回答