Operation之变换操作符
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之变换操作符的更多相关文章
- RxJava2实战---第五章 变换操作符和过滤操作符
RxJava2实战---第五章 变换操作符和过滤操作符 RxJava的变换操作符主要包括以下几种: map():对序列的每一项都用一个函数来变换Observable发射的数据序列. flatMap() ...
- Operation之过滤操作符
filter 该操作符就是用来过滤掉某些不符合要求的事件 Observable.of(2, 30, 22, 5, 60, 3, 40, 9) .filter{ $0 > 10 } .subscr ...
- Operation之结合操作符
startWith 该方法会在Observable序列开始之前插入一些事件元素. 即发生事件消息之前, 会发出这些预先插入的事件消息 Observable.of("2", &quo ...
- RxJava【变换】操作符 map flatMap concatMap buffer MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- RxJava系列之二 变换类操作符具体解释1
1.回想 上一篇文章我们主要介绍了RxJava , RxJava 的Observables和 RxJava的just操作符.以及RxJava一些经常使用的操作. 没看过的抓紧点我去看吧. 事实上RxJ ...
- RxJava(10-操作符原理&自定义操作符)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51791120 本文出自:[openXu的博客] 目录: 自定义创建操作符 数据序列操作符li ...
- RxJava操作符(03-变换操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51649975 本文出自:[openXu的博客] 目录: Buffer FlatMap fla ...
- Rxjava - 操作符,线程操作的简单使用
目录 创建操作符 10种常用的操作符定义 下面做几个操作符的demo演示 create from repeat defer interval Scheduler 什么是Scheduler? 如何使用S ...
- Java基础常见英语词汇
Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ...
随机推荐
- Ecshop 2.x-3.x RCE漏洞复现
说是复现,其实来源于一道CTF题目(Ecshop3.x RCE) 链接:http://www.whalwl.cn:8030 1. 漏洞概述 ECShop的user.php文件中的display函数的模 ...
- first集合follow集的求法
FIRST集的定义 : 设G=(VT,VN,P,S)是上下文无关文法 FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*} 若a=>*ε则规定ε∈FIRST (a) FIRST ...
- KVM虚拟机被OOM killer
一.线上环境的虚拟机被KVM物理机kill掉 Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于 ...
- CentOS7.0 内核(3.10.0-123.el7.x86_64)bug导致KVM物理机重启
一.问题描述 服务器硬件:DELL R720 系统版本:CentOS7.0 内核版本:3.10.0-123.el7.x86_64 故障现象:偶尔会重启 二.问题原因 经查看dmesg日志发现是kern ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- NSData、数据结构与数据转换
数据结构公式:Data_Structure=(D,R): 只要数据元素与数据(组织关系)能够保持:同一个数据(结构)可以在各种存贮形式间进行转换. 字节流或字符串是所有转化的中间节点(中转站).相当于 ...
- 临时加一条关于bootstrap的菜单栏方面的
**有些生疏,记住了**aria-expanded表示展开状态.默认为undefined, 表示当前展开状态未知.其它可选值:true表示元素是展开的:false表示元素不是展开的. aria-hid ...
- imm自动发现有问题,监控项不再支持
IPMI是计算机系统的远程"关闭"或"带外"管理的标准接口.它可以独立于操作系统直接从所谓的"带外"管理卡监视硬件状态.华为的服务器叫做BM ...
- 【JZOJ5553】【20190625】谜
题目 给出一个\(2\times n\)个点的二分图的邻接矩阵\(M\) 以及\(m\)个行替换元,\(k\)个列替换元 \(q\)次询问:op u v 表示用第v个行/列替换元去替换矩阵的第u行/列 ...
- SHOI做题记录
LOJ #2027. 「SHOI2016」黑暗前的幻想乡 考虑到每个公司一条边,那就等价于没有任何一家公司没有边. 然后就可以容斥+矩阵树定理,没了. LOJ #2028. 「SHOI2016」随机序 ...