Pour merge
eux, ils doivent avoir le même type pour leur Element
. Donc, une option est de jeter leurs informations de type et de les convertir en AnyObject
. Maintenant, ils peuvent être fusionnées:
let stringSubject = PublishSubject<String>()
let stringObservable = stringSubject.asObservable().map { $0 as AnyObject }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { $0 as AnyObject }
Observable.of(stringObservable, intObservable).merge()
.subscribeNext { print($0) }
.addDisposableTo(disposeBag)
stringSubject.onNext("a")
stringSubject.onNext("b")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("c")
Sortie:
un
b
c
Une autre option serait d'envelopper ensuite dans un ENUM :
enum Container {
case S(String)
case I(Int)
}
let stringSubject = PublishSubject<String>()
let stringObservable = stringSubject.asObservable().map { Container.S($0) }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { Container.I($0) }
Observable.of(stringObservable, intObservable).merge()
.subscribeNext { e in
switch e {
case .S(let str):
print("next element is a STRING: \(str)")
case .I(let int):
print("next element is an INT: \(int)")
}
}
.addDisposableTo(disposeBag)
stringSubject.onNext("a")
stringSubject.onNext("b")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("c")
sortie:
élément suivant est une chaîne: un
élément suivant est une chaîne: b
élément suivant est un INT: 1
élément suivant est un INT: 2
prochaine élément est une chaîne: c
comme pour les autres opérateurs qui peuvent se combiner Observable
s de divers types (comme zip
et combineLatest
), aucun ne fonctionne tout à fait comme merge
. Cependant, vérifiez-les. Ils pourraient être mieux adaptés à vos besoins.