可从多个 BehaviorRelay RxSwift 观察到
Observable from more than one BehaviorRelay RxSwift
我正在尝试使用 RxSwift 实现对 3 个不同 BehaviorRelay 的订阅。思路如下:
let disposeBag = DisposeBag()
class ClassA{
var br1 = BehaviorRelay(value: "BR1_1")
var br2 = BehaviorRelay(value: "BR2_1")
var br3 = BehaviorRelay(value: "BR3_1")
/* Some other variables */
}
let classA = ClassA()
class ClassB:CustomStringConvertible{
let classA:ClassA
var description: String{
return "\(br1.value), \(br2.value), \(br3.value)"
}
var br1:BehaviorRelay<String>{
return classA.br1
}
var br2:BehaviorRelay<String>{
return classA.br2
}
var br3:BehaviorRelay<String>{
return classA.br3
}
init(classA:ClassA) {
self.classA = classA
}
}
let classB = ClassB(classA: classA)
classB.br1.asObservable().subscribe { (value) in
print(value)
}
classA.br1.accept("BR1_2")
它打印:
next(BR1_1)
next(BR1_2)
通过这样做,我是 "populating" 我的 ClassB 和来自 ClassA 的对象,通过设置对 ClassB 中对象的订阅,我可以对下一个事件做出反应。
但是,我想创建一个函数,例如:
func reactingFunction(br1:BehaviorRelay<String>, br2:BehaviorRelay<String>, br3:BehaviorRelay<String>){
/**/
}
每次任何 br 产生 onNext 事件时调用。我可以为所有这些创建混合订阅吗?
谢谢
我通过实施 CombineLast 找到了解决方案:
Observable.combineLatest(classB.br1, classB.br2, classB.br3).subscribe(onNext: { (br1, br2, br3) in
reactingFunction(br1: br1, br2: br2, br3: br3)
}).disposed(by: disposeBag)
然后我将 reactingFunction 更改为仅接受值:
func reactingFunction(br1:String, br2:String, br3:String){
print("Reacting Function -> \(br1) & \(br2) \(br3)")
}
来自示例:
classA.br1.accept("BR1_2")
classA.br1.accept("BR1_3")
classA.br1.accept("BR1_4")
classA.br1.accept("BR1_5")
classA.br2.accept("BR2_2")
classA.br3.accept("BR3_2")
classA.br2.accept("BR2_3")
它打印:
Reacting Function -> BR1_1 & BR2_1 BR3_1
Reacting Function -> BR1_2 & BR2_1 BR3_1
Reacting Function -> BR1_3 & BR2_1 BR3_1
Reacting Function -> BR1_4 & BR2_1 BR3_1
Reacting Function -> BR1_5 & BR2_1 BR3_1
Reacting Function -> BR1_5 & BR2_2 BR3_1
Reacting Function -> BR1_5 & BR2_2 BR3_2
Reacting Function -> BR1_5 & BR2_3 BR3_2
我正在尝试使用 RxSwift 实现对 3 个不同 BehaviorRelay 的订阅。思路如下:
let disposeBag = DisposeBag()
class ClassA{
var br1 = BehaviorRelay(value: "BR1_1")
var br2 = BehaviorRelay(value: "BR2_1")
var br3 = BehaviorRelay(value: "BR3_1")
/* Some other variables */
}
let classA = ClassA()
class ClassB:CustomStringConvertible{
let classA:ClassA
var description: String{
return "\(br1.value), \(br2.value), \(br3.value)"
}
var br1:BehaviorRelay<String>{
return classA.br1
}
var br2:BehaviorRelay<String>{
return classA.br2
}
var br3:BehaviorRelay<String>{
return classA.br3
}
init(classA:ClassA) {
self.classA = classA
}
}
let classB = ClassB(classA: classA)
classB.br1.asObservable().subscribe { (value) in
print(value)
}
classA.br1.accept("BR1_2")
它打印:
next(BR1_1)
next(BR1_2)
通过这样做,我是 "populating" 我的 ClassB 和来自 ClassA 的对象,通过设置对 ClassB 中对象的订阅,我可以对下一个事件做出反应。
但是,我想创建一个函数,例如:
func reactingFunction(br1:BehaviorRelay<String>, br2:BehaviorRelay<String>, br3:BehaviorRelay<String>){
/**/
}
每次任何 br 产生 onNext 事件时调用。我可以为所有这些创建混合订阅吗?
谢谢
我通过实施 CombineLast 找到了解决方案:
Observable.combineLatest(classB.br1, classB.br2, classB.br3).subscribe(onNext: { (br1, br2, br3) in
reactingFunction(br1: br1, br2: br2, br3: br3)
}).disposed(by: disposeBag)
然后我将 reactingFunction 更改为仅接受值:
func reactingFunction(br1:String, br2:String, br3:String){
print("Reacting Function -> \(br1) & \(br2) \(br3)")
}
来自示例:
classA.br1.accept("BR1_2")
classA.br1.accept("BR1_3")
classA.br1.accept("BR1_4")
classA.br1.accept("BR1_5")
classA.br2.accept("BR2_2")
classA.br3.accept("BR3_2")
classA.br2.accept("BR2_3")
它打印:
Reacting Function -> BR1_1 & BR2_1 BR3_1
Reacting Function -> BR1_2 & BR2_1 BR3_1
Reacting Function -> BR1_3 & BR2_1 BR3_1
Reacting Function -> BR1_4 & BR2_1 BR3_1
Reacting Function -> BR1_5 & BR2_1 BR3_1
Reacting Function -> BR1_5 & BR2_2 BR3_1
Reacting Function -> BR1_5 & BR2_2 BR3_2
Reacting Function -> BR1_5 & BR2_3 BR3_2