2016-08-20 51 views

回答

10

merge他們,他們需要爲他們的Element有相同的類型。

所以,一種選擇是扔掉他們的類型信息並投射到AnyObject。現在,他們可以被合併:

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") 

輸出:

一個
b
ç

另一種選擇是在一個枚舉包裹然後:

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") 

輸出:

下一個元素是一個字符串:一個
下一個元素是一個字符串:乙
下一個元素是一個INT:1個
下一個元素是一個INT:2
下元素是字符串:c

至於其他運營商,可以結合Observable各種類型(如zipcombineLatest),沒有一個工作很像merge。但是,檢查出來。它們可能更適合您的要求。