可从多个 BehaviorRelay RxSwift 观察到

Posted

技术标签:

【中文标题】可从多个 BehaviorRelay RxSwift 观察到【英文标题】:Observable from more than one BehaviorRelay RxSwift 【发布时间】:2019-05-28 14:21:00 【问题描述】:

我正在尝试使用 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)

通过这样做,我将使用 ClassA 中的对象“填充”我的 ClassB,并通过设置对 ClassB 中的对象的订阅,我可以对下一个事件做出反应。

但是,我想创建一个函数,例如:

func reactingFunction(br1:BehaviorRelay<String>, br2:BehaviorRelay<String>, br3:BehaviorRelay<String>)
    /**/

每次 br 产生 onNext 事件时调用。我可以为所有人创建一个混合订阅吗?

谢谢

【问题讨论】:

【参考方案1】:

我通过实施 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

【讨论】:

以上是关于可从多个 BehaviorRelay RxSwift 观察到的主要内容,如果未能解决你的问题,请参考以下文章

BehaviorRelay RxSwift 的私有接受

使用 Observable 绑定 BehaviorRelay - RxSwift

在 RxSwift 中修改 behaviorRelay 数组内的属性

RxSwift BehaviorRelay auto isDisposed

如何从 BehaviorRelay observable 更新 tableView?

RxJava 的 RxSwift 变量或 BehaviorRelay 的内置等效项