RxSwift 合并不同类型的 Observables

Posted

技术标签:

【中文标题】RxSwift 合并不同类型的 Observables【英文标题】:RxSwift merge different kind of Observables 【发布时间】:2016-12-27 06:21:49 【问题描述】:

我应该如何在 RxSwift 中合并 2 种不同类型的 Observables?

例如:

var a: Observable<Int>
var b: Observable<Void>

Observable.of(a,b).merge() 是不可能的,因为类型参数不同。

【问题讨论】:

【参考方案1】:

对于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")

输出:

一个 b 1 2 c

另一种选择是将 then 包装在一个枚举中:

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

至于可以组合不同类型的Observables 的其他运算符(如zipcombineLatest),没有一个像merge 那样工作。但是,请检查这些。它们可能更适合您的要求。

【讨论】:

【参考方案2】:

如果您想合并两个 observable,但不需要 Element 的值,并且想要在使用 .map $0 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 合并不同类型的 Observables的主要内容,如果未能解决你的问题,请参考以下文章

使用 RXSwift 的警报消息的 UIViewController 扩展

压缩后 RxSwift 丢失订单

在 RxSwift 中处理嵌套的 observables

RxSwift:结合不同类型的可观察对象和映射结果

RxSwift - 来自 Singleton 的不同类型的队列 observables

如何使用 RxSwift 和 RxSwiftDataSources 将表视图与表示不同数据类型的多个部分绑定?