RxSwift:将 Zip 与不同类型的可观察对象一起使用
RxSwift: Use Zip with different type observables
我正在使用 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!)
}
虽然这显然很难看。什么是更好的方法?
这对我有用。我在 Xcode7、RxSwift-2.0.0-beta
中进行了测试
zip(just(1), just("!")) { (a, b) in
return (a,b)
}
以下是如何使其适用于 RxSwift 2.3+
Observable.zip(Observable.just(1), Observable.just("!")) {
return ([=10=], )
}
或
Observable.zip(Observable.just(1), Observable.just("!")) {
return (anyName0: [=11=], anyName1: )
}
如果您使用 Singles (RxSwift 5.0+)
Single.zip(single1, single2) {
return ([=10=], )
}
或
Observable.zip(single1.asObservable(), single2.asObservable()) {
return ([=11=], )
}
示例:
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()
我正在使用 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!)
}
虽然这显然很难看。什么是更好的方法?
这对我有用。我在 Xcode7、RxSwift-2.0.0-beta
中进行了测试zip(just(1), just("!")) { (a, b) in
return (a,b)
}
以下是如何使其适用于 RxSwift 2.3+
Observable.zip(Observable.just(1), Observable.just("!")) {
return ([=10=], )
}
或
Observable.zip(Observable.just(1), Observable.just("!")) {
return (anyName0: [=11=], anyName1: )
}
如果您使用 Singles (RxSwift 5.0+)
Single.zip(single1, single2) {
return ([=10=], )
}
或
Observable.zip(single1.asObservable(), single2.asObservable()) {
return ([=11=], )
}
示例:
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()