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 ...
随机推荐
- OOM问题定位
一:堆内存溢出 Java创建的对象一般都是分配在堆中,如果是由于过期对象没能回收(内存泄漏)或者对象过多导致放不下(内存溢出),一般报错: Exception in thread \"m ...
- leetcode139
class Solution { public: bool wordBreak(string s, vector<string> wordDict) { vector<, false ...
- Python正则替换字符串函数re.sub用法示例(1)
本文实例讲述了Python正则替换字符串函数re.sub用法.分享给大家供大家参考,具体如下: python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串然后把它替 ...
- Nginx隐藏标识以及其版本号
1.隐藏版本号 curl Nginx服务器时,有这么一行Server: nginx,说明我用的是 Nginx 服务器,但并没有具体的版本号.由于某些 Nginx 漏洞只存在于特定的版本,隐藏版本号可以 ...
- 剑指offer例题——反转链表
题目描述 输入一个链表,反转链表,输出新链表的表头 程序编写 将链表反转 public class Solution { public ListNode ReverseList(ListNode he ...
- Intersect交集Except差集Union并集实例
int[] oldArray = { 1, 2, 3, 4, 5 };int[] newArray = { 2, 4, 5, 7, 8, 9 };var jiaoJi = oldArray.Inter ...
- 对于链表中tada的绝对值相等的点,仅保留第一次出现的结点而删除其余绝对值相等的点
算法的核心思想是用空间换时间,使用辅助数组记录链表中已出现的数值 从而只需对链表进行一趟扫描 typedef struct node { int data; struct node* next; } ...
- 大数据入门到精通14--hive 对 字符串的操作
一.基本操作 concat(string,string,string)concat_ws(string,string,string)select customer_id,concat_ws(" ...
- iOS的SVN
1.cornerstone 2.smart svn mac (比较好用) 3.还xcode自带的.
- 飞鱼星、H3C企业路由器配置
飞鱼星企业路由器配置外网访问IIS 只配置端口映射就行,配置好了,如果不立即重启,需要等几分钟才能生效 H3C路由器配置虚拟服务器即可