2017-06-20 15 views
0

この例のような関数を作りたいと思います。RxSwift - 1つのObservable内の複数の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 $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

あなたはObservable.combineLatest(..) メソッドを使用することができ、ここでは代わりにDriverのRxSwift Variableを使用することができますし、2回の観測で待機するようにします。以下は は、あなたがそれを達成することができる方法の例です:

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

関連する問題