RxSwift合并了不同种类的Observables
如何Observable
在RxSwift中合并2种不同类型的?
例如:
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")
输出:
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
。但是,请检查一下。它们可能更适合您的要求。
以上是 RxSwift合并了不同种类的Observables 的全部内容, 来源链接: utcz.com/qa/412572.html