RxSwift 合并不同类型的 Observables
RxSwift merge different kind of Observables
我应该如何在 RxSwift 中合并 2 种不同类型的 Observable
?
例如:
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 { [=10=] as AnyObject }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { [=10=] as AnyObject }
Observable.of(stringObservable, intObservable).merge()
.subscribeNext { print([=10=]) }
.addDisposableTo(disposeBag)
stringSubject.onNext("a")
stringSubject.onNext("b")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("c")
输出:
a
b
1
2
c
另一种选择是将 then 包装在枚举中:
enum Container {
case S(String)
case I(Int)
}
let stringSubject = PublishSubject<String>()
let stringObservable = stringSubject.asObservable().map { Container.S([=11=]) }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { Container.I([=11=]) }
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 element is a STRING: a
next element is a STRING: b
next element is an INT: 1
next element is an INT: 2
next element is a STRING: c
至于可以组合不同类型的 Observable
的其他运算符(如 zip
和 combineLatest
),none 的工作方式与 merge
非常相似.但是,检查那些。它们可能更适合您的要求。
如果你想合并两个 observable 但你不需要 Element
的值并且想在使用 .map { [=13=] as AnyObject }
选项时摆脱 Expression of type 'AnyObject' is unused
:
var a = PublishSubject<Int>()
var b = PublishSubject<Void>()
let observable = Observable.merge(a.map { _ in return Void() }, b)
我应该如何在 RxSwift 中合并 2 种不同类型的 Observable
?
例如:
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 { [=10=] as AnyObject }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { [=10=] as AnyObject }
Observable.of(stringObservable, intObservable).merge()
.subscribeNext { print([=10=]) }
.addDisposableTo(disposeBag)
stringSubject.onNext("a")
stringSubject.onNext("b")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("c")
输出:
a
b
1
2
c
另一种选择是将 then 包装在枚举中:
enum Container {
case S(String)
case I(Int)
}
let stringSubject = PublishSubject<String>()
let stringObservable = stringSubject.asObservable().map { Container.S([=11=]) }
let intSubject = PublishSubject<Int>()
let intObservable = intSubject.asObservable().map { Container.I([=11=]) }
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 element is a STRING: a
next element is a STRING: b
next element is an INT: 1
next element is an INT: 2
next element is a STRING: c
至于可以组合不同类型的 Observable
的其他运算符(如 zip
和 combineLatest
),none 的工作方式与 merge
非常相似.但是,检查那些。它们可能更适合您的要求。
如果你想合并两个 observable 但你不需要 Element
的值并且想在使用 .map { [=13=] as AnyObject }
选项时摆脱 Expression of type 'AnyObject' is unused
:
var a = PublishSubject<Int>()
var b = PublishSubject<Void>()
let observable = Observable.merge(a.map { _ in return Void() }, b)