当前位置: 首页 > 面试题库 >

RxSwift合并了不同种类的Observables

暴德运
2023-03-14
问题内容

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



 类似资料:
  • 我正在尝试合并两个不同类型的列表。我得到了两个不同的API响应从改造在一个android应用程序,第一个列表是一个电影列表定义为 公共类列表{ 我通过以下操作成功地从API中检索到列表 然后,我尝试将一个类型列表和一个类型字符串列表组合起来,以创建一个新类ListingAndImage(字符串是一个URL,我将加载到imageview中) 我的问题是,哪种方式最好将这两个列表组合起来,形成一个列表

  • 我有一个特定的任务,就是使用Apache Flink和一些附加逻辑将两个数据流连接到一个聚合中。 基本上我有两个数据流:事件流和所谓的元事件流。我使用Apache Kafka作为消息主干。我试图实现的是根据元事件中给出的信息触发评估的聚合/窗口。基本情况是: 事件的数据流开始发出的记录; 记录基于某个键在某个聚合或窗口中不断累积; 元事件数据流接收一个带有给定键的新,该键还定义了将在事件数据流中发

  • 原文:What’s new in RxSwift 5 作者:freak4pc 译注:在此感谢 freak4pc 为社区所作出的贡献。 RxSwift 5 终于发布了,我(freak4pc)认为这是一个很好的机会,来分享这次发布中最有价值的更新。 别担心,这次发布几乎是向前兼容的,只有少数弃用和重命名的 API。但它还包含了许多改进,我(freak4pc)将在下面详细介绍。 RxRelay 现在是一

  • 我在Cplex中使用Python API来解决一个线性编程问题。使用Cplex时,我的结果如下: 但随后我将LP prolem保存为LP文件,并再次使用Cplex进行求解,结果与第一个略有不同: 下面是我的功能:

  • 我目前正在处理一个与sping-data-neo4j(当前版本)的项目,当我试图将两个类及其属性合并到一个NodeEntity时,我面临一个问题。下面是我的两节课: ... 通过定义用@Index注释的id属性,SDN正在进行合并,而不是插入具有相同索引的多个节点。 我想要实现的是,如果我保存一个Ent1实例,然后保存另一个与Ent1实体具有相同id的Ent2实例,那么结果节点中应该存在两个数据属

  • 我知道重载是在编译时决定的,但当我试图运行下面的示例时,它给出了我无法理解的结果 当我每次运行这个代码片段时,我都会得到“Collection”的输出,这意味着调用参数为Collection的classify方法。 请解释