2016-08-20 1 views

Répondre

10

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.