swift - RxSwift 合并不同类型的 Observables

标签 swift frp rx-swift

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

例如:

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

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

最佳答案

合并它们,它们的元素需要具有相同的类型。

因此,一种选择是丢弃它们的类型信息并转换为 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

另一种选择是将 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")

输出:

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 的运算符(如 zipcombineLatest),没有一个像 合并。但是,检查那些。它们可能更适合您的要求。

关于swift - RxSwift 合并不同类型的 Observables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050059/

相关文章:

ios - 未从 VideoPreviewLayer 调用 attemptsBegan 方法

ios - 尝试使用具有新属性的每个 SKSpriteNode

javascript - Bacon.js 控制流与其他流的缓冲

javascript - RX Subject 使用最后一个值添加新的 emit

swift - RXAlamofire 不返回数据(错误与否)

ios - RxSwift 触发可观察执行

快速组合 : How can I convert `AnyPublisher<[Foo], *>` to `AnyPublisher<Foo, *>` ?

ios - MoPub 快速集成无法正常工作

Obj-C 的 Swift 桥接头

ios - RxSwift 绑定(bind)数据到 UIButton 内存泄漏