RxSwift 合并不同类型的 Observable [英] RxSwift merge different kind of Observables
问题描述
我应该如何在 RxSwift 中合并 2 种不同类型的 Observable
?
How should I merge 2 different types of Observable
s in RxSwift?
例如:
var a: Observable<Int>
var b: Observable<Void>
Observable.of(a,b).merge()
由于类型参数不同而无法实现.
Observable.of(a,b).merge()
is not possible because of type parameter difference.
推荐答案
要合并
它们,它们的Element
需要具有相同的类型.
To merge
them, they need to have the same type for their Element
.
因此,一种选择是丢弃它们的类型信息并转换为 AnyObject
.现在它们可以合并:
So, one option is to throw away their type information and cast to AnyObject
. Now they can be merged:
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")
输出:
一个
乙
1
2
a
b
1
2
c
另一种选择是将 then 包装在枚举中:
Another option would be to wrap then in an enum:
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")
输出:
下一个元素是一个字符串:a
下一个元素是一个字符串:b
下一个元素是 INT:1
下一个元素是一个 INT:2
下一个元素是一个字符串: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
),没有一个像 那样工作>合并代码>.但是,请检查这些.它们可能更适合您的要求.
As for the other operators that can combine Observable
s of varying types (like zip
and combineLatest
), none work quite like merge
. However, check those out. They might be better suited to your requirements.
这篇关于RxSwift 合并不同类型的 Observable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!