RxSwift - 一个 Observable 中的多个 Observable 值
RxSwift - multiple Observable value within one Observable
我想做一个像这个例子的函数。
例子
let num1 = Driver<Int>
let num2 = Driver<Int>
let result = Driver<String>
num1 = Observable.just(...).asDriver()
num2 = Observable.just(...).asDriver()
result = ??? // When both num1 and num2 are subscribed, this becomes a higher value among them as String.
// This type of code will be used
/*
if [=10=] >= {
return "num1 = \([=10=])"
} else {
return "num2 = \()"
}
*/
如何实现?
你可以在这里使用 RxSwift Variable
而不是 Driver
并且要监听两个 Observables,你可以使用 Observable.combineLatest(..)
方法。
下面是一个如何实现它的例子:
let num1: Variable<Int>!
let num2: Variable<Int>!
let bag = DisposeBag()
num1 = Variable(1)
num2 = Variable(2)
let result = Observable.combineLatest(num1.asObservable(), num2.asObservable()) { (n1, n2) -> String in
if n1 >= n2 {
return "num1 = \(n1)"
} else {
return "num2 = \(n2)"
}
}
result.subscribe(onNext: { (res) in
print("Result \(res)")
}).addDisposableTo(bag)
num1.value = 5
num1.value = 8
num2.value = 10
num2.value = 7
它输出:
Result num2 = 2
Result num1 = 5
Result num1 = 8
Result num2 = 10
Result num1 = 8
如果可以,请不要使用变量。您已经有几个可观察对象,所以请使用它们,但是,combineLatest
是这里的解决方案:
import RxSwift
let num1 = Observable.just(3)
let num2 = Observable.just(5)
let result = Observable.combineLatest(num1, num2).map { [=10=] >= ? "num1 = \([=10=])" : "num2 = \()" }
_ = result.subscribe(onNext: { print([=10=]) })
上面的代码在正确配置的 playground 中打印 "num2 = 5"。
我想做一个像这个例子的函数。
例子
let num1 = Driver<Int>
let num2 = Driver<Int>
let result = Driver<String>
num1 = Observable.just(...).asDriver()
num2 = Observable.just(...).asDriver()
result = ??? // When both num1 and num2 are subscribed, this becomes a higher value among them as String.
// This type of code will be used
/*
if [=10=] >= {
return "num1 = \([=10=])"
} else {
return "num2 = \()"
}
*/
如何实现?
你可以在这里使用 RxSwift Variable
而不是 Driver
并且要监听两个 Observables,你可以使用 Observable.combineLatest(..)
方法。
下面是一个如何实现它的例子:
let num1: Variable<Int>!
let num2: Variable<Int>!
let bag = DisposeBag()
num1 = Variable(1)
num2 = Variable(2)
let result = Observable.combineLatest(num1.asObservable(), num2.asObservable()) { (n1, n2) -> String in
if n1 >= n2 {
return "num1 = \(n1)"
} else {
return "num2 = \(n2)"
}
}
result.subscribe(onNext: { (res) in
print("Result \(res)")
}).addDisposableTo(bag)
num1.value = 5
num1.value = 8
num2.value = 10
num2.value = 7
它输出:
Result num2 = 2
Result num1 = 5
Result num1 = 8
Result num2 = 10
Result num1 = 8
如果可以,请不要使用变量。您已经有几个可观察对象,所以请使用它们,但是,combineLatest
是这里的解决方案:
import RxSwift
let num1 = Observable.just(3)
let num2 = Observable.just(5)
let result = Observable.combineLatest(num1, num2).map { [=10=] >= ? "num1 = \([=10=])" : "num2 = \()" }
_ = result.subscribe(onNext: { print([=10=]) })
上面的代码在正确配置的 playground 中打印 "num2 = 5"。