Наблюдаемый от более чем одного BehaviorRelay RxSwift - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь подписаться на 3 разных BehaviorRelay с помощью RxSwift.Идея заключается в следующем:

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)

Делая это, я «заполняю» свой ClassB объектами из ClassA и устанавливая подписку на объекты в ClassBя могу реагировать на следующие события.

Однако я хотел бы создать такую ​​функцию, как:

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

, которая будет вызываться каждый раз, когда любой из br производит событие onNext.Могу ли я создать смешанную подписку для всех из них?

Спасибо

1 Ответ

0 голосов
/ 28 мая 2019

Я нашел решение, реализовав 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)

Затем я изменил реагирующую функцию, чтобы она принимала только значения:

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
...