RxSwift合并了不同种类的Observables

问题描述

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。但是,请检查一下。它们可能更适合您的要求。

解决方法

如何Observable在RxSwift中合并2种不同类型的?

例如:

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

Observable.of(a,b).merge() 由于类型参数差异而无法使用。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...