一、组合操作符

① startWith

  • startWith 方法会在 Observable 序列开始之前插入一些事件元素,即发出事件消息之前,会先发出这些预先插入的事件消息。

  • 如下所示:
 Observable.of("2", "3", "4").startWith("1").subscribe(onNext: { print($0) }).disposed(by: disposeBag)// 输出结果1234
  • 插入多个数据,如下所示:
    Observable.of("2", "3", "4").startWith("1").startWith("0").startWith("B").startWith("A").subscribe(onNext: { print($0) }).disposed(by: disposeBag)// 输出结果AB01234

② merge

  • 将将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列,并将像每个源可观察序列发出元素一样发出每个元素。

  • 如下所示:
    let subject1 = PublishSubject<String>()let subject2 = PublishSubject<String>()Observable.of(subject1, subject2).merge().subscribe(onNext: { print($0) }).disposed(by: disposeBag)subject1.onNext("s")subject1.onNext("w")subject2.onNext("i")subject2.onNext("f")subject1.onNext("t")// 输出结果swift

③ zip

  • zip 方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列,而且它会等到每个 Observable 事件一一对应地凑齐之后再合并。
  • 可以将多达 8 个源可观测序列组合成一个新的可观测序列,并将从组合的可观测序列中发射出对应索引处每个源可观测序列的元素。

  • 如下所示:
    let stringSubject = PublishSubject<String>()let intSubject = PublishSubject<Int>()Observable.zip(stringSubject, intSubject) { stringElement, intElement in"\(stringElement) \(intElement)"}.subscribe(onNext: { print($0) }).disposed(by: disposeBag)stringSubject.onNext("Y")stringSubject.onNext("D")intSubject.onNext(1)intSubject.onNext(2)stringSubject.onNext("W")intSubject.onNext(3)// 输出结果Y 1D 2W 3
  • 只有两个序列同时有值的时候才会响应,否则存值。

④ combineLatest

  • combineLatest 是将多个(两个或两个以上的)Observable 序列元素进行合并。
    但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并。
  • combineLatest 可以将 8 源可观测序列组合成一个新的观测序列,并将开始发出联合观测序列的每个源的最新元素可观测序列,一旦所有排放源序列至少有一个元素,并且当源可观测序列发出的任何一个新元素。

  • 如下所示:
    let stringSub = PublishSubject<String>()let intSub = PublishSubject<Int>()Observable.combineLatest(stringSub, intSub) { strElement, intElement in"\(strElement) \(intElement)"}.subscribe(onNext: { print($0) }).disposed(by: disposeBag)stringSub.onNext("D")     // 存一个 DstringSub.onNext("W")     // 存了一个覆盖 - 和zip不一样intSub.onNext(1)          // 发现 strOB 也有 W 响应 W 1intSub.onNext(2)          // 覆盖1 -> 2 发现 strOB 有值W 响应 W 2stringSub.onNext("Y")     // 覆盖W -> Y 发现 intOB 有值2 响应 Y 2// 输出结果W 1W 2Y 2

⑤ switchLatest

  • 将可观察序列发出的元素转换为可观察序列,并从最近的内部可观察序列发出元素。
  • switchLatest 方法可以将两个 Observable 序列合并为一个,每当 self 队列发射一个元素时,便从第二个序列中取出最新的一个值。
 let switchLatestSub1 = BehaviorSubject(value: "Y")let switchLatestSub2 = BehaviorSubject(value: "1")let switchLatestSub  = BehaviorSubject(value: switchLatestSub1)// 选择了 switchLatestSub1 就不会监听 switchLatestSub2switchLatestSub.asObservable().switchLatest().subscribe(onNext: { print($0) }).disposed(by: disposeBag)switchLatestSub1.onNext("D")switchLatestSub1.onNext("_")switchLatestSub2.onNext("2")switchLatestSub2.onNext("3") // 2-3都会不会监听,但是默认保存由 2覆盖1 3覆盖2switchLatestSub.onNext(switchLatestSub2) // 切换到 switchLatestSub2switchLatestSub1.onNext("*")switchLatestSub1.onNext("W") // 原理同上面 下面如果再次切换到 switchLatestSub1 会打印出 YDWswitchLatestSub2.onNext("4")// 输出结果YD_34
  • 组合操作符的使用都比较简单,它们的原理都类似,以 combineLatest 为例:
    • 初始化中 self._arity = arity 就是管理的序列个数;
    • 初始化中 self._hasValue 就是一个初始化的个数为 arity 的,里面的值都是 false;
    • 核心逻辑 next(_ index: Int) 方法中,判断 self._hasValue[index] 就是刚刚初始化的集合,第一次进来就是第一个序列,进来就会标记 true,并且 _numberOfValues+1,此时就是0->1;
    • 继续往下面走,发现 _numberOfValues < arity 就会跳过;
    • 如果下次还是第一个序列进来,第一层判断就通不过,后面还是跳过;
    • 如果下次进来的是第二个序列,那么第一层判断就会进去,进来就会标记 true,并且 _numberOfValues+1,此时就是1->2;
    • 第二层判断也满足条件 self._numberOfValues == self._arity,取回 let result = try self.getResult() 响应结果,然后就发送出去:self.forwardOn(.next(result));
    • 综合得出 combineLatest 必须两个序列都响应才会响应最终的结果。

⑥ withLatestFrom

  • 将两个 Observables 最新的元素通过一个函数组合起来,当第一个 Observable 发出一个元素,就将组合后的元素发送出来:

  • withLatestFrom 操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,通过一个组合函数将两个最新的元素合并后发送出去。
  • 当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,然后把第二个 Observable 中最新的元素发送出去,示例如下:
let disposeBag = DisposeBag()
let firstSubject = PublishSubject<String>()
let secondSubject = PublishSubject<String>()firstSubject.withLatestFrom(secondSubject).subscribe(onNext: { print($0) }).disposed(by: disposeBag)firstSubject.onNext("												

RxSwift之常用高阶函数(操作符Operator)的说明和使用相关推荐

  1. Kotlin的高阶函数和常用高阶函数

    Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...

  2. python list大小_4个python常用高阶函数的使用方法

    1.map Python内建了map()函数,map()函数接受两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每一个元素上,并把结果作为新的Iterator返回. 举 ...

  3. python四种常用高阶函数

    1.什么是高阶函数 把函数作为参数传入,这样的函数称为高阶函数 例如·: def func1(x,y,f):return f(x) + f(y) num = func1(-10, 2, abs) pr ...

  4. Swift 常用高阶函数

    Swift 常用高阶函数 map函数 对每一个元素进行运算 计算每一个元素的count 对元素进行大小写变换 转换类型 sorted函数 从小到大排序 从大到小排序 flatMap函数 降维 过滤元素 ...

  5. javascript数组常用高阶函数

    一·数组常用高阶函数 Array.prototype.filter() 此方法接收一个回调函数作为参数,回调参数接受三个参数,item(源数组中的每一个元素).index(数组下标).arr(源数组) ...

  6. Kotlin常用高阶函数

    高阶函数 高阶函数可以把函数作为参数传递或者返回值返回的函数.既然函数对象作为数值进行传递那么就会有如何引用函数的问题.函数引用的三种方式: 直接双冒号的方式,引用的是包级别的函数: // 这种引用适 ...

  7. python四大高阶函数求导_4个python常用高阶函数的使用方法

    1.map Python内建了map()函数,map()函数接受两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每一个元素上,并把结果作为新的Iterator返回. 举 ...

  8. kotlin 常用高阶函数

    package kotlinall.chapter5import java.io.BufferedReader import java.io.FileReader import java.lang.S ...

  9. ClickHouse常用高阶函数

    文章目录 一.去重 1.arrayDistinct 2.arrayUniq 3.arrayCompact 二.数组属性 1.arrayJoin 2.arrayFilter 3.arrayEnumera ...

最新文章

  1. HTML语言的一些元素(三)
  2. Horizon View 6-安装View Composer组件⑵
  3. HDU_2795 Billboard(线段树)
  4. 迅速重载nginx脚本
  5. C语言中字符数组的初始化与注意事项
  6. 干货|219个opencv常用函数汇总
  7. python编写个人信息_1、纯python编写学生信息管理系统
  8. 数据结构之链表(Linked list)
  9. 《Python极客项目编程 》——2.4 完整代码
  10. 中国虾养殖和捕捞现状分析,养殖产量成上升趋势「图」
  11. 【人工智能行业大师访谈4】吴恩达采访Yoshua Bengio
  12. 使用Arduino开发板制作自动药物提醒器
  13. bzoj4987 Tree 树形dp
  14. 六、Dubbo协议模块原理源码解析
  15. 经验分享-iMX8MQ设计底板硬件指南-第一章
  16. Win10杀毒软件大PK:Defender垫底 卡巴/小红伞第一
  17. 蓝桥云课linux入门4:目录结构及文件基本操作
  18. 我们这一代人的困惑 - 转载
  19. 2021.06.03邮票面值设计
  20. 分享180个美美的CSS渐变样式效果图

热门文章

  1. Python攻克之路-网络编程(文件上传实现思路)
  2. UIImage常用的分类
  3. Javascript的怪癖
  4. 一个支持Abort的BackgroundWorker
  5. proxy跨域不生效_vue前后端端口号不同,proxytable代理跨域无效
  6. vrep和matlab,VREP与MATLAB联合仿真程序--UR5机械臂动力学控制
  7. linux定时任务_从零开始学Linux运维|41.定时任务crontab
  8. mooc构建结构数组的笔记
  9. msg批量转html,SysTools MSG Converter(MSG格式转换器)
  10. C语言学习之用筛选法求100之内的素数