2017-06-20 84 views
0

我想做一个像这个例子一样的函数。RxSwift - 在一个可观测值内的多个可观测值

例如

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)" 
} 
*/ 

如何实现的呢?

回答

1

不要使用变量,如果你能帮助它。你已经有几个观测,以便使用它们,但没错,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) }) 

上面打印“NUM2 = 5”时,它放置在一个正确配置的游乐场。

+0

谢谢。我正在寻找这个! – Byoth

1

您可以在这里使用RxSwift Variable而不是Driver并且在两个Obserbles上监听,您可以使用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 
+1

谢谢!但在我的情况下,'num1'和'num2'也应该能够订阅其他变量。我的问题是通过其他答案解决的,但您的回答也帮助我了解了RxSwift。 – Byoth