buffer

  • buffer方法的作用是缓冲组合, 第一个参数是缓冲时间, 第二个参数是缓冲个数, 第三个参数是线程
  • 该方法简单来说就是缓存Observable中发出的新元素, 当元素达到某个数量, 或者经过了特定的时间, 他就会将这个元素集合发送出来
let subject = PublishSubject<String>()
subject.buffer(timeSpan: 1, count: 3, scheduler: MainScheduler.instance)
.subscribe(onNext: {print($0)})
.disposed(by: bag) subject.onNext("a")
subject.onNext("b")
subject.onNext("c") subject.onNext("1")
subject.onNext("2")
subject.onNext("3") subject.onNext("^_^")
subject.onCompleted()

window

  • window操作符和buffer十分相似. 不过buffer是周期性的将缓存的元素集合发送出来, 而window周期性的将元素集合以Observable的形式发送出来
  • 同时buffer要顶到元素搜集完毕后, 才会发出元素序列. 而window可以实时发出元素序列
let subject2 = PublishSubject<String>()
subject2
.window(timeSpan: 1, count: 3, scheduler: MainScheduler.instance)
.subscribe(onNext:{[weak self] in
print($0)
$0.subscribe(onNext: {print($0)}).disposed(by: self!.bag)
})
.disposed(by: bag)
subject2.onNext("a")
subject2.onNext("b")
subject2.onNext("c") subject2.onNext("1")
subject2.onNext("2")
subject2.onNext("3") subject2.onNext("^_^")
subject2.onCompleted()

map

  • 该操作符通过传入一个函数闭包把原来的Observable序列转变为一个新的Observable序列
Observable.of(1, 2, 3)
.map{$0 * 10}
.subscribe(onNext: { print($0) })
.disposed(by: bag)

flatMap

  • flatMap操作符会对源Observable的每一个元素应用一个转换方法, 将他们转换成Observables. 然后将这些Observables的元素合并之后在发送出来. 即又将其"拍扁"(降维)成一个Observable序列
let subject41 = BehaviorSubject(value: "A")
let subject42 = BehaviorSubject(value: "1") let variable4 = Variable(subject41) variable4.asObservable().flatMap { $0 }.subscribe(onNext: { print($0) }).disposed(by: bag)
subject41.onNext("B")
variable4.value = subject42
subject42.onNext("2")
subject41.onNext("C")

flatMapLatest

  • flatMapLatest 与 flatMap 的唯一区别是: flatMapLatest 只会接收最新的value事件
  • 上面的案例中 flatMap 修改为 flatMapLatest
let subject51 = BehaviorSubject(value: "A")
let subject52 = BehaviorSubject(value: "1") let variable5 = Variable(subject51) variable5.asObservable().flatMapLatest{ $0 }.subscribe(onNext: { print($0) }).disposed(by: bag) subject51.onNext("B")
variable5.value = subject52
subject52.onNext("2")
subject51.onNext("C")

concatMap

  • concatMap 与 flatMap 的唯一区别是: 当前一个Observable元素发送完毕后, 后一个Observable才可以开始发送元素. 或者说等待前一个Observable产生完成事件后, 才对后一个Observable进行订阅
let subject61 = BehaviorSubject(value: "A")
let subject62 = BehaviorSubject(value: "1") let variable6 = Variable(subject61) variable6.asObservable().flatMapLatest{ $0 }.subscribe(onNext: { print($0) }).disposed(by: bag) subject61.onNext("B")
variable6.value = subject62
subject62.onNext("2") // 因为subject61还没有结束, 所以不会打印
subject61.onNext("C")
subject61.onCompleted() // 让subject61完成或者error, 上面的subject62发出的事件才会被监听到

scan

  • scan就是先给一个初始化的数, 然后不断的拿前一个结果和最新的值进行处理操作
Observable.of(1,2,3,4,5)
.scan(0) { (acum, item) -> Int in
acum + item
}
.subscribe(onNext: { print($0) })
.disposed(by: bag)

groupBy

  • groupBy 操作符将源Observable分解为多个子Observable, 然后将这些子Observable发送出来
  • 也就是说改操作符会将元素通过某个键进行分组, 然后将分组后的元素序列以Observable的形态发送出来
Observable.of(1,2,3,4,5,7,8,13)
.groupBy { (item) -> String in
item % 2 == 0 ? "偶数" : "奇数"
}.subscribe(onNext: { [weak self] group in
group.asObservable().subscribe(onNext: {event in
print("group: \(group)")
print("key: \(group.key)")
print("event: \(event)")
}).disposed(by: self!.bag)
}).disposed(by: bag)

Operation之变换操作符的更多相关文章

  1. RxJava2实战---第五章 变换操作符和过滤操作符

    RxJava2实战---第五章 变换操作符和过滤操作符 RxJava的变换操作符主要包括以下几种: map():对序列的每一项都用一个函数来变换Observable发射的数据序列. flatMap() ...

  2. Operation之过滤操作符

    filter 该操作符就是用来过滤掉某些不符合要求的事件 Observable.of(2, 30, 22, 5, 60, 3, 40, 9) .filter{ $0 > 10 } .subscr ...

  3. Operation之结合操作符

    startWith 该方法会在Observable序列开始之前插入一些事件元素. 即发生事件消息之前, 会发出这些预先插入的事件消息 Observable.of("2", &quo ...

  4. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. RxJava系列之二 变换类操作符具体解释1

    1.回想 上一篇文章我们主要介绍了RxJava , RxJava 的Observables和 RxJava的just操作符.以及RxJava一些经常使用的操作. 没看过的抓紧点我去看吧. 事实上RxJ ...

  6. RxJava(10-操作符原理&自定义操作符)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51791120 本文出自:[openXu的博客] 目录: 自定义创建操作符 数据序列操作符li ...

  7. RxJava操作符(03-变换操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51649975 本文出自:[openXu的博客] 目录: Buffer FlatMap fla ...

  8. Rxjava - 操作符,线程操作的简单使用

    目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...

  9. Java基础常见英语词汇

    Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的                             ['prəʊɡræmɪŋ]编程 OO: object ...

随机推荐

  1. php单例型(singleton pattern)

    搞定,吃饭 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single ...

  2. Win10上的Docker应用:Kubernetes(容器集群)

    阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ...

  3. 项目Beta冲刺(5/7)(追光的人)(2019.5.27)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

  4. C++将模板的声明和定义放置在同一个头文件里

    1. 一个类: 头文件用于保存类的声明:定义文件保存类的实现.   2. 分离编译模式: 允许在一个编译单元(.cpp文件)中定义函数.类型.类对象等,然后在另一个编译单元中引用它们.编译器处理完所有 ...

  5. 轻松学习之三——IMP指针的作用

    http://www.jianshu.com/p/425a39d43d16 可能大家一直看到有许多朋友在Runtime相关文章中介绍IMP指针的概念,那么IMP究竟有什么实际作用呢?让我们先从一个函数 ...

  6. [iOS] 利用 NSAttributedString 进行富文本处理

    /iOS /[iOS] 利用 NSAttributedString 进行富文本处理 2016年4月4日 刘小龙 iOS 许多时候我们需要以各种灵活的形式展现文本信息,即富文本.普通的 text 属性显 ...

  7. haproxy 2.0 dataplaneapi rest api 几个方便的问题排查接口

    在使用haproxy 2.0 dataplaneapi的时候,刚开始的时候我们可能需要进行调试,保证我们的配置在我们的系统环境中 是可以使用的,以下是自己在当前学习中为了排查问题会使用的几个api 创 ...

  8. ssh配置连接远程主机 彻底解放你的双手

    查看ssh支持配置 man ssh_config 打开ssh并配置 vi ~/.ssh/config 基本配置示例说明 密钥文件连接 Host <别名> Port <机器端口号> ...

  9. 大数定律(Law of Large Numbers)

    大数定律:每次从总体中随机抽取1个样本,这样抽取很多次后,样本的均值会趋近于总体的期望.也可以理解为:从总体中抽取容量为n的样本,样本容量n越大,样本的均值越趋近于总体的期望.当样本容量极大时,样本均 ...

  10. 面试题必备-web页面基础

    html标签是由<>包围的关键词 html标签是成对出现的 有部分标签是没有结束标签的,叫单标签, 页面中所有的内容,都是要放在HTML标签中的 HTML标签分三部分: 标签名称 标签内容 ...