RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy
1.buffer的基本使用
let publishSubject = PublishSubject<String>()
//buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。
//该方法简单来说就是缓存 Observable 中发出的新元素,当元素达到某个数量,或者经过了特定的时间,它就会将这个元素集合发送出来。 publishSubject.buffer(timeSpan: 1, count: 3, scheduler: MainScheduler.instance).subscribe {
print("\($0)")
}.disposed(by: disposeBag) publishSubject.onNext("a")
publishSubject.onNext("b")
publishSubject.onNext("c")
publishSubject.onNext("d")
publishSubject.onNext("e")
publishSubject.onNext("f") publishSubject.onNext("1")
publishSubject.onNext("2")
publishSubject.onNext("3") /*
=====count: 5
next(["a", "b", "c", "d", "e"])
next(["f", "1", "2", "3"])
next([])
next([])
........ =====count: 3
next(["a", "b", "c"])
next(["d", "e", "f"])
next(["1", "2", "3"])
next([])
next([])
........
*/
2.Window的基本使用
// window基本介绍
// window 操作符和 buffer 十分相似。不过 buffer 是周期性的将缓存的元素集合发送出来,而 window 周期性的将元素集合以 Observable 的形态发送出来。
// 同时 buffer 要等到元素搜集完毕后,才会发出元素序列。而 window 可以实时发出元素序列。
publishSubject.window(timeSpan: 1, count: 3, scheduler: MainScheduler.instance)
.subscribe {[weak self] (observable) in
print(observable)
observable.element?.asObservable().subscribe{
print($0)
}.disposed(by: self!.disposeBag)
}.disposed(by: disposeBag) publishSubject.onNext("a")
publishSubject.onNext("b")
publishSubject.onNext("c") publishSubject.onNext("1")
publishSubject.onNext("2")
publishSubject.onNext("3") /*
next(RxSwift.AddRef<Swift.String>)
next(a)
next(b)
next(c)
completed
next(RxSwift.AddRef<Swift.String>)
next(1)
next(2)
next(3)
completed
next(RxSwift.AddRef<Swift.String>)
completed
next(RxSwift.AddRef<Swift.String>)
...
*/
publishSubject.window(timeSpan: 1, count: 3, scheduler: MainScheduler.instance).subscribe( onNext: {[weak self] in
print($0)
$0.asObservable().subscribe(onNext:{
print($0)
}).disposed(by: self!.disposeBag)
}).disposed(by: disposeBag)
publishSubject.onNext("a")
publishSubject.onNext("b")
publishSubject.onNext("c")
publishSubject.onNext("1")
publishSubject.onNext("2")
publishSubject.onNext("3")
/*
RxSwift.AddRef<Swift.String>
a
b
c
RxSwift.AddRef<Swift.String>
1
2
3
RxSwift.AddRef<Swift.String>
RxSwift.AddRef<Swift.String>
RxSwift.AddRef<Swift.String>
...
*/
3.map的基本使用:
//map:该操作符通过传入一个函数闭包把原来的 Observable 序列转变为一个新的 Observable 序列。
Observable.of(1,2,3).map { (int) -> Int in
return int*10
}.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
//简写
Observable.of(1,2,3).map { $0*10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) print("===============")
4.flatmap基本使用:
//flatMap: ??
//map 在做转换的时候容易出现“升维”的情况。即转变之后,从一个序列变成了一个序列的序列。
//而 flatMap 操作符会对源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。
//然后将这些 Observables 的元素合并之后再发送出来。即又将其 "拍扁"(降维)成一个 Observable 序列。
//这个操作符是非常有用的。比如当 Observable 的元素本生拥有其他的 Observable 时,我们可以将所有子 Observables 的元素发送出来。
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1")
let variable = Variable(subject1) variable.asObservable()
.flatMap { $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) subject1.onNext("B")
variable.value = subject2
subject2.onNext("2")
subject1.onNext("C") /*
A
B
1
2
C
*/
5.flatMaplatest的基本使用:
//flatMapLatest: ??
//flatMapLatest 与 flatMap 的唯一区别是:flatMapLatest 只会接收最新的 value 事件。
variable.asObservable()
.flatMapLatest { $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) subject1.onNext("B")
variable.value = subject2
subject2.onNext("2")
subject1.onNext("C") /*
A
B
1
2
*/
6.groupBy的基本使用:
//groupBy:
//groupBy 操作符将源 Observable 分解为多个子 Observable,然后将这些子 Observable 发送出来。
//也就是说该操作符会将元素通过某个键进行分组,然后将分组后的元素序列以 Observable 的形态发送出来。
Observable<Int>.of(0, 1, 2, 3, 4, 5)
.groupBy(keySelector: { (element) -> String in
return element % 2 == 0 ? "偶数" : "基数"
})
.subscribe { (event) in
switch event {
case .next(let group):
group.asObservable().subscribe({ (event) in
print("key:\(group.key) event:\(event)")
})
.disposed(by: self.disposeBag)
default:
print("")
}
}
.disposed(by: disposeBag) /*
key:偶数 event:next(0)
key:基数 event:next(1)
key:偶数 event:next(2)
key:基数 event:next(3)
key:偶数 event:next(4)
key:基数 event:next(5)
key:偶数 event:completed
key:基数 event:completed
*/
RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy的更多相关文章
- javaSE学习笔记(11)--- Map
javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...
- JavaScript学习笔记(六)——Map、Set与iterable
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- scala学习笔记(8): 列表的map,flatMap,zip和reduce
map,flatMap,zip和reduce函数可以让我们更容易处理列表函数. 1 map函数map将一个函数应用于列表的每一个元素并且将其作为一个新的列表返回.我们可以这样对列表的元素进行平方: s ...
- Spark 学习笔记之 Streaming Window
Streaming Window: 上图意思:每隔2秒统计前3秒的数据 slideDuration: 2 windowDuration: 3 例子: import org.apache.kafka.c ...
- Java学习笔记之:Java Map集合
一.介绍 通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的. 二.笔记 /** * Map:接口. 不是collection的子类 key -value 键值对 key唯一不能重 ...
- RxSwift学习笔记5:Binder
使用 Binder 创建观察者 //Observable序列(每隔1秒钟发出一个索引数) let scheduleObservable = Observable<Int>.interval ...
- RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder
let disposeBg = DisposeBag() //直接在创建 //在 subscribe 方法中创建 let ofObserval = Observable.of("a" ...
- ES6学习笔记(10)----Set和Map数据结构
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Set和Map数据结构 1.Set 基本用法 Set是一种新的数据结构,它的成员都是唯一 ...
- 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 5 Window to a Wider World
Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...
随机推荐
- 自己动手实现JDK动态代理
出自:作者:孤独烟 http://rjzheng.cnblogs.com/ ------------------------------------------------------------- ...
- Idea中运行项目时出现:未结束的字符串解决方案
一般出现这种情况是编码不一致导致 解决办法: settings>file Encodings 编码设置成一致
- Github使用笔记——创建远程库
系统:CentOS7 一.yum install git 二.配置 git config --global user.name "XXX" git config -global u ...
- mysql数据库支持 emoji表情
关键点: 1. 修改mysql数据库表ALTER table <tablename> modify <clolum> char(100) character set utf ...
- python 的深浅copy
1.引用: A=B, 修改B后,A会被修改 2.浅拷贝:A=copy.copy(B) 3.深拷贝:A=copy.deepcopy(B) 如果希望任何改变,两个对象都不会相互影响,用深拷贝.详情参考:h ...
- XGBoost参数调优小结
https://mp.weixin.qq.com/s?__biz=MzU0MDQ1NjAzNg==&mid=2247485630&idx=1&sn=9edf2bfd771cf4 ...
- 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)
2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ...
- properties文件读写工具类
java代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...
- Python类继承(转发)
目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...
- FortiGate下用户访问特定网址不通
1.现状: 如图,上网行为管理和防火墙控制用户的数据访问,到外网的出口链路有2条:联通的和电信的,其中联通的优先级较高. 2.现象: 用户访问www.xxxxbbs.com不通 3.分析 在上网行为管 ...