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

的其他运算符(如zipcombineLatest),没有一个像那样工作merge。但是,请检查一下。它们可能更适合您的要求。

以上是 RxSwift合并了不同种类的Observables 的全部内容, 来源链接: utcz.com/qa/412572.html

回到顶部