RxSwift 系列(五)

前言

本篇文章将要学习RxSwift中过滤和条件操作符,在RxSwift中包括了:

  • filter
  • distinctUntilChanged
  • elementAt
  • single
  • take
  • takeLast
  • takeWhile
  • takeUntil
  • skip
  • skipWhile
  • skipWhileWithIndex
  • skipUntil

filter

Observable序列中只发出满足过滤条件的事件。

let disposeBag = DisposeBag()

Observable.of(1,2,3,4,5).filter({$0 > 2}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

3
4
5

distinctUntilChanged

过滤连续发出的相同事件

let disposeBag = DisposeBag()
Observable.of(1,2,3,3,3,2,2,5,4).distinctUntilChanged().subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

1
2
3
2
5
4

elementAt

Observable只发出指定位置的事件

let disposeBag = DisposeBag()

Observable.of(1,2,3,5,4).elementAt(2).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

3

single

用法一:检测Observable序列是否发射一个元素。如果发射多个,会报错。

let disposeBag = DisposeBag()

// error:Sequence contains more than one element
// Observable.of(1,2,3).single().subscribe(onNext: {print($0)}).disposed(by: disposeBag)

Observable.of(1).single().subscribe(onNext: {print($0)}).disposed(by: disposeBag)

用法二:检测Observable序列发射的元素里面是否包含多个指定的元素,如果有多个或者没有,会报错。

let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
    .single { $0 == "??" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

Observable.of("??", "??", "??", "??", "??", "??")
    .single { $0 == "??" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

Observable.of("??", "??", "??", "??","??")
    .single { $0 == "??" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

打印结果:

next(??)
completed
error(Sequence doesn‘t contain any elements.)
next(??)
error(Sequence contains more than one element.)

take

Observable序列开始点起只处理前几个事件。

let disposeBag = DisposeBag()

Observable.of(1,2,3).take(2).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

1
2

takeLast

take相反,从Observable序列的结束位置起,只处理前几个事件。

let disposeBag = DisposeBag()
Observable.of(1,2,3).takeLast(2).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

2
3

takeWhile

只处理满足条件的事件。感觉和filter没什么区别

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5).takeWhile{$0 < 3}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

1
2

takeUntil

直到另一个Observable序列发出一个信号,则原序列终止。

let disposeBag = DisposeBag()

let orinSubject = PublishSubject<Int>()
let refreSubject = PublishSubject<Int>()

orinSubject.takeUntil(refreSubject).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

orinSubject.onNext(1)
orinSubject.onNext(2)
refreSubject.onNext(10)
orinSubject.onNext(3)

打印结果:

1
2

skip

Observable序列的元素跳过指定个数。

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6).skip(2).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

3
4
5
6

skipWhile

跳过满足条件的事件,只要遇见不满足条件的事件,则该事件以及之后的事件(不管是否满足条件)都会发出。

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6).skipWhile{$0 < 3}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

3
4
5
6

skipWhileWithIndex

跳过索引满足条件的事件。

let disposeBag = DisposeBag()
Observable.of(1,2,3,4,5,6).skipWhileWithIndex({ (element, index) -> Bool in
        index < 3
    }).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

打印结果:

4
5
6

skipUntil

跳过另一个Observable序列发出事件之前的所有事件。与takeUntil相反。

let disposeBag = DisposeBag()

let oriSubject = PublishSubject<Int>()
let refreSubject = PublishSubject<Int>()

oriSubject.skipUntil(refreSubject).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

oriSubject.onNext(1)
oriSubject.onNext(2)

refreSubject.onNext(10)
oriSubject.onNext(3)
oriSubject.onNext(4)

打印结果:

3
4

致谢

如果发现有错误的地方,欢迎评论,感谢!

时间: 2024-08-12 14:03:21

RxSwift 系列(五)的相关文章

RxSwift 系列(三)

RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable.Combination Operators在RxSwift中的实现有五种: startWith merge zip combineLatest switchLatest startWith 在Observable释放元素之前,发射指定的元素序列.更多详情上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东

Apache Kafka系列(五) Kafka Connect及FileConnector示例

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程Consumer方案 Apache Kafka系列(五) Kafka Connect及FileConnector示例 一. Kafka Connect简介 Kafka是一个使用越来越广的消息系统,尤其是在大数据开发中(实时数据处理和分析).为何集成其他系统和解耦应用,经常使用Producer来发送消

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

RX系列五 | Schedulers线程控制

RX系列五 | Schedulers线程控制 在我们上一篇文章中的,我们的小例子里有这么一段代码 //网络访问 .observeOn(Schedulers.io()) 事实上,我们在使用网络操作的时候,便可以控制其运行在哪个线程中,而Schedulers类,有四个方法,分别是 Schedulers.immediate(); Schedulers.newthread(); Schedulers.io(); Schedulers.computation(); 以及RxAndroid中的Android

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

C语言快速入门系列(五)

C语言快速入门系列(五) C语言指针初涉                                           ------转载请注明出处:coder-pig 本节引言: 上一节我们对C语言复合数据类型中的数组进行了解析,在本节中,我们会对C语言复合数据类型中的 重点,C语言的灵魂-----指针进行学习!使用指针的好处:利用指针可以表示与使用复杂的数据结构; 更加方便地使用我们的数组与字符串;可以像汇编语言一样直接处理内存单元地址;可以动态地进行内存空间 分配,C语言指针是重点,同

互联网金融的前世、今生和未来-系列五(今生):互联网金融的有效监管

互联网金融的前世.今生和未来--系列一:山雨欲来 互联网金融的前世.今生和未来-系列二(前世):金融与技术的首次亲密接触之金融电子化 互联网金融的前世.今生和未来-系列三(今生):一场跨界的战争 互联网金融的前世.今生和未来-系列四(今生):百花齐放的互联网金融业态 今生:金融与互联网的深度融合--互联网金融 金融行业作为现代经济的核心,对国民经济的平稳运行至关重要.为防止出现金融市场失灵的情况,如内幕交易.信息不对称.信托责任.监管套利.系统性风险及羊群效应等,世界各国政府普遍会基于本国的金融

Maven 系列 五 :使用Nexus搭建Maven私服

1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载.                                                  我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus.这

SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. 通过前面几篇文章介绍了