如何Observable在RxSwift中合并2种不同类型的?
Observable
例如:
var a: Observable<Int> var b: Observable<Void>
Observable.of(a,b).merge() 由于类型参数差异而无法使用。
Observable.of(a,b).merge()
对merge他们来说,他们需要具有相同的类型Element。
merge
Element
因此,一种选择是丢弃它们的类型信息并转换为AnyObject。现在可以将它们合并:
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")
输出:
a b 1 2 c
另一种选择是将其包装在一个枚举中:
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")
next元素是STRING: 下一个元素是STRING:b next元素是INT:1 next元素是INT:2 next元素是STRING:c
至于可以组合Observable不同类型的s 的其他运算符(如zip和combineLatest),没有一个像那样工作merge。但是,请检查一下。它们可能更适合您的要求。
zip
combineLatest