RxSwift 系列(三) -- Combination Operators

RxSwift 系列(三) -- Combination Operators

前言

本篇文章将要学习如何将多个Observables组合成一个ObservableCombination OperatorsRxSwift中的实现有五种:

  • startWith
  • merge
  • zip
  • combineLatest
  • switchLatest

startWith

Observable释放元素之前,发射指定的元素序列。更多详情 上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东西。 举个?:

let disposeBag = DisposeBag()
Observable.of(["C","C++","OC"]).startWith(["先吃饱饭再学习"]).subscribe({ (event) in
        print(event)
    }).disposed(by: disposeBag)

在我们发射["C","C++","OC"]之前,我们指定了发射["先吃饱饭再学习"],因此控制台上的打印结果是:

next(["先吃饱饭再学习"])
next(["C", "C++", "OC"])
completed

startWith和栈类似,先进后出。什么意思呢?你可以在上面的例子中再添加几个.startWith()试试。

merge

将多个Observable组合成单个Observable,并且按照时间顺序发射对应事件。更多详情

感觉和gitmerge操作是一样的效果。

let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
    
subject1.onNext("?️")
subject1.onNext("?️")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("?")
subject2.onNext("③")

zip

将多个Observable(注意:必须是要成对)组合成单个Observable,当有事件到达时,会在每个序列中对应的索引上对应的元素发出。(ps:之前版本的RxSwift好像最多只能组合8个Observable)更多详情

let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.zip(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
    
subject1.onNext("A")
subject1.onNext("B")
subject1.onNext("C")
    
subject2.onNext("1")
subject2.onNext("2")

上述代码,因为subject.onNext("C")没有与之对应的Observable,因此不会打印,让我们看看打印结果:

A--1
B--2

combineLatest

当一个项目由两个Observables发射时,通过一个指定的功能将每个Observable观察到的最新项目组合起来,并根据该功能的结果发射事件。更多详情

let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.combineLatest(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
    
subject1.onNext("A")
    
subject2.onNext("1")
subject2.onNext("2")
    
subject1.onNext("B")
subject1.onNext("C")

输出结果:

A--1
A--2
B--2
C--2

图解:

switchLatest

切换Observable队列。

let disposeBag = DisposeBag()
    
let subject1 = BehaviorSubject(value: "1")
let subject2 = BehaviorSubject(value: "A")
    
let variable = Variable(subject1)
    
variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
subject1.onNext("2")
subject1.onNext("3")
    
variable.value = subject2
    
subject1.onNext("4")
subject2.onNext("B")

打印结果:

1
2
3
A
B

图解:

致谢

如果发现有错误的地方,欢迎评论,感谢!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEE

spring和springboot中加密连接数据库的信息前言:一、spring中加密连接数据库的信息:二、springboot项目中加密数据库连接信息:总结:

在实际开发中,一些关键的信息肯定是要加密的,否则就太不安全了。比如连接数据库的用户名和密码,一般就需要加密。接下来就看看spring项目和spring boot...

26430
来自专栏用户2442861的专栏

Qt学习之路_6(Qt局域网聊天软件)

http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html

18710
来自专栏程序员Gank

【译】在正确的线程上观察

尽管很多人了解RxJava的基本逻辑,但是在Observable链和操作符究竟运行在哪个线程,仍然会有许多困惑。

11820
来自专栏用户2442861的专栏

Qt学习之路_6(Qt局域网聊天软件)

http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html

33120
来自专栏移动端开发

iOS加密算法总结

常用加密算法: ---- DES:Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。 DES(数...

614120
来自专栏osc同步分享-java技术分享站

MD5 加密和 BASE64 编码

package com.yawn.security; import java.security.MessageDigest; import java.util...

385110
来自专栏一名合格java开发的自我修养

网络安全

对称密钥中,加解密双方难以使用相同密钥,难以事先确定使用一样的密钥。如果网上传输密钥,也会被人截取(截取后,该信息不会发给接收方,只能由接收方发)知道的,恶意者...

12030
来自专栏北京马哥教育

Python3 加密解密技术详解

引言 Python 3 的标准库中没多少用来解决加密的,不过却有用于处理哈希的库。 在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyC...

80750
来自专栏Android开发实战

Security &quot;Crypto&quot; provider deprecated in Android N

我们知道加密[算法]都是需要密钥的,比如 AES 算法支持128 比特、192 比特和 256 比特三种长度的密钥,通常这些密钥会被转化成字节数组明文写在代码中...

15650
来自专栏三好码农的三亩自留地

浅析 RxJava 2.x 线程调度

为了说明原理,排除干扰,这里用了最简单的逻辑。产生一个字符串“Hello rxJava”, 然后在监听中打印log,subscribeOn(Schedulers...

11610

扫码关注云+社区

领取腾讯云代金券