RxSwift - 一个 Observable 中的多个 Observable 值

Byo*_*oth 4 ios swift rx-swift

我想做一个像这个例子一样的函数。

例子

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 $0 >= $1 {
    return "num1 = \($0)"
} else {
    return "num2 = \($1)"
}
*/
Run Code Online (Sandbox Code Playgroud)

如何实施?

Max*_*Max 5

你可以Variable在这里使用 RxSwift而不是Driverand 来监听两个 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
Run Code Online (Sandbox Code Playgroud)

它输出:

Result num2 = 2
Result num1 = 5
Result num1 = 8
Result num2 = 10
Result num1 = 8
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 5

如果可以,请不要使用变量。你已经有几个 observables 所以使用它们,但是是的,combineLatest这里是解决方案:

import RxSwift

let num1 = Observable.just(3)
let num2 = Observable.just(5)
let result = Observable.combineLatest(num1, num2).map { $0 >= $1 ? "num1 = \($0)" : "num2 = \($1)" }

_ = result.subscribe(onNext: { print($0) })
Run Code Online (Sandbox Code Playgroud)

当它被放置在一个正确配置的操场上时,上面会打印“num2 = 5”。