5
如何合併RxSwift中的兩種不同類型的Observable
?RxSwift合併不同種類的觀察對象
例如:
var a: Observable<Int>
var b: Observable<Void>
Observable.of(a,b).merge()
是因爲類型參數差異的不可能的。
如何合併RxSwift中的兩種不同類型的Observable
?RxSwift合併不同種類的觀察對象
例如:
var a: Observable<Int>
var b: Observable<Void>
Observable.of(a,b).merge()
是因爲類型參數差異的不可能的。
要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
各種類型(如zip
和combineLatest
),沒有一個工作很像merge
。但是,檢查出來。它們可能更適合您的要求。