RxSwift 入坑解读-你所需要知道的各种概念

相信大家很早就听说过函数式响应编程概念,我是去年面试的时候接触到函数式响应编程的,当时也是第一次接触到MVVM这个概念,转眼都一年过去了,我却没有在函数式编程上做深入的研究,说来还真是惭愧。

不过最近由于想要使用RxSwift,所以趁这个时候好好接触和研究一下传说中的函数式编程,由于网上关于RxSwift的教程资料很少,这篇文章其实就是最RxSwift官方文档和一些概念做一些解读。算是大家学习的参考文章吧! 先挖个坑,这可能会是一个RxSwift系列,希望大家在学习的时候有所参考。

这篇文章也发布在我的博客中,阅读效果更棒哦!

RxSwift是什么

RxSwif是ReactiveX的Swift版本,也就是一个函数式响应编程的框架。对,就这一句话。想要知道他做什么的,我们先来了解一下观察者模式。

观察者模式

关于观察者模式我想大伙应该都很了解了吧,什么KVO,通知等都是观察者模式,在设计模式中他可是一个重中之重的设计模式啊!比如一个宝宝在睡觉,爸爸妈妈,爷爷奶奶总不能在那边一只看着吧?那样子太累了。他们该做啥事就做啥事呗,只要听到宝宝的哭声,他们就给宝宝喂奶就行了。这就是一个典型的观察者模式。宝宝是被观察者,爸爸妈妈等是观察者也称作订阅者,只要被观察者发出了某些事件比如宝宝哭声、叫声都是一个事件,通知到订阅者,订阅者们就可以做相应的处理工作。哈哈,观察者模式很简单吧?

RxSwift做了什么

RxSwift把我们程序中每一个操作都看成一个事件,比如一个TextField中的文本改变,一个按钮被点击,或者一个网络请求结束等,每一个事件源就可以看成一个管道,也就是sequence,比如TextField,当我们改变里面的文本的时候,这个TextField就会不断的发出事件,从他的这个sequence中不断的流出,我们只需要监听这个sequence,每流出一个事件就做相应的处理。同理,Button也是一个sequence,每点击一次就流出一个事件。也就是我们把每一步都想成是一个事件就好去理解RxSwift了。看下图是不是很好理解了?

11693607-539880f0dd058976

sequence.png

Observable和Observer

理解了观察者模式这两个概念就很好理解了,Observable就是可被观察的,也就是我们说的宝宝,他也是事件源。而Observer就是我们的观察者,也就是当收到事件的时候去做某些处理的爸爸妈妈。观察者需要去订阅(subscribe)被观察者,才能收到Observable的事件通知消息。

下面开始一些基本概念解读,通读一遍你会对RxSwift有非常深刻的认识了,其实也就是对整理了一下官方文档和加上自己的一些理解

创建和订阅被观察者

下面创建被观察者其实就是创建一个Obserable的sequence,就是创建一个流,然后就可以被订阅subscribe,这样被观察者发出时间消失,我们就能做相应的处理

DisposeBag

DisposeBag其实就相当于iOS中的ARC似得,会在适当的时候销毁观察者,相当于内存管理者吧。

subscribe

subscribe是订阅sequence发出的事件,比如next事件,error事件等。而subscribe(onNext:)是监听sequence发出的next事件中的element进行处理,他会忽略error和completed事件。相对应的还有subscribe(onError:) 和 subscribe(onCompleted:)

never

never就是创建一个sequence,但是不发出任何事件信号。

12693607-b3487ed03ec04e5c

never.png

empty

empty就是创建一个空的sequence,只能发出一个completed事件

13693607-f57e76a6830fef08

empty.png

just

just是创建一个sequence只能发出一种特定的事件,能正常结束

14693607-e3ee91873f021bcf

just.png

of

of是创建一个sequence能发出很多种事件信号

如果把上面的onNext:去掉的话,结果会是这样子,也正好对应了我们subscribe中,subscribe只监听事件。

from

from就是从集合中创建sequence,例如数组,字典或者Set

create

我们也可以自定义可观察的sequence,那就是使用create

15693607-95889cfe73da98ae

create.png

create操作符传入一个观察者observer,然后调用observer的onNext,onCompleted和onError方法。返回一个可观察的obserable序列。

range

range就是创建一个sequence,他会发出这个范围中的从开始到结束的所有事件

16693607-3cc210e164e60e03

range.png

repeatElement

创建一个sequence,发出特定的事件n次

17693607-4533773906429a2f

repeat.png

generate

generate是创建一个可观察sequence,当初始化的条件为true的时候,他就会发出所对应的事件

deferred

deferred会为每一为订阅者observer创建一个新的可观察序列

18693607-291576531e859653

defered.png

下面例子中每次进行subscribe的时候都会去创建一个新的deferredSequence,所以Emitting会打印两遍。

error

创建一个可观察序列,但不发出任何正常的事件,只发出error事件并结束

doOn

doOn我感觉就是在直接onNext处理时候,先执行某个方法,doOnNext( :)方法就是在subscribe(onNext:)前调用,doOnCompleted(:)就是在subscribe(onCompleted:)前面调用的。

学会使用Subjects

Subjet是observable和Observer之间的桥梁,一个Subject既是一个Obserable也是一个Observer,他既可以发出事件,也可以监听事件。

PublishSubject

当你订阅PublishSubject的时候,你只能接收到订阅他之后发生的事件。subject.onNext()发出onNext事件,对应的还有onError()和onCompleted()事件

19693607-2c41f649b52606f5

publishsubject.png

ReplaySubject

当你订阅ReplaySubject的时候,你可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小

20693607-aa9d4953bf6d3a84

replaysubject.png

BehaviorSubject

当你订阅了BehaviorSubject,你会接受到订阅之前的最后一个事件。

21693607-5b6fcf5d70780604

behaviorsubject.png

PublishSubject, ReplaySubject和BehaviorSubject是不会自动发出completed事件的。

Variable

Variable是BehaviorSubject一个包装箱,就像是一个箱子一样,使用的时候需要调用asObservable()拆箱,里面的value是一个BehaviorSubject,他不会发出error事件,但是会自动发出completed事件。

联合操作

联合操作就是把多个Observable流合成单个Observable流

startWith

在发出事件消息之前,先发出某个特定的事件消息。比如发出事件2 ,3然后我startWith(1),那么就会先发出1,然后2 ,3.

22693607-8f60ab3c900aa790

startwith.png

merge

合并两个Observable流合成单个Observable流,根据时间轴发出对应的事件

23693607-f2f8af4760c09dd1

merge.png

zip

绑定超过最多不超过8个的Observable流,结合在一起处理。注意Zip是一个事件对应另一个流一个事件。

24693607-72fdd28f1d8ca29c

zip.png

combineLatest

绑定超过最多不超过8个的Observable流,结合在一起处理。和Zip不同的是combineLatest是一个流的事件对应另一个流的最新的事件,两个事件都会是最新的事件,可将下图与Zip的图进行对比。

25693607-edecc427c26d4b3a

combinlatest.png

switchLatest

switchLatest可以对事件流进行转换,本来监听的subject1,我可以通过更改variable里面的value更换事件源。变成监听subject2了

26693607-f3ca896faf6de818

switch.png

变换操作

map

通过传入一个函数闭包把原来的sequence转变为一个新的sequence的操作

27693607-0687f1e73b8bd339

transform.png

flatMap

将一个sequence转换为一个sequences,当你接收一个sequence的事件,你还想接收其他sequence发出的事件的话可以使用flatMap,她会将每一个sequence事件进行处理以后,然后再以一个sequence形式发出事件。而且flatMap有一次拆包动作,请看代码解析。

28693607-695c20af1152bca7

flatmap.png

flatMapLatest

flatMapLatest只会接收最新的value事件,将上例改为flatMapLatest。结果为

scan

scan就是给一个初始化的数,然后不断的拿前一个结果和最新的值进行处理操作。

过滤和约束

filter

filter很好理解,就是过滤掉某些不符合要求的事件

distinctUntilChanged

distinctUntilChanged就是当下一个事件与前一个事件是不同事件的事件才进行处理操作

elementAt

只处理在指定位置的事件

single

找出在sequence只发出一次的事件,如果超过一个就会发出error错误

take

只处理前几个事件信号,

takeLast

只处理后几个事件信号

takeWhile

当条件满足的时候进行处理

takeUntil

接收事件消息,直到另一个sequence发出事件消息的时候。

skip

取消前几个事件

skipWhile

满足条件的事件消息都取消

skipWhileWithIndex

满足条件的都被取消,传入的闭包同skipWhile有点区别而已

skipUntil

直到某个sequence发出了事件消息,才开始接收当前sequence发出的事件消息

数学操作

toArray

将sequence转换成一个array,并转换成单一事件信号,然后结束

reduce

用一个初始值,对事件数据进行累计操作。reduce接受一个初始值,和一个操作符号

concat

concat会把多个sequence和并为一个sequence,并且当前面一个sequence发出了completed事件,才会开始下一个sequence的事件。

在第一sequence完成之前,第二个sequence发出的事件都会被忽略,但会接收一完成之前的二发出的最后一个事件。不好解释,看例子说明

连接性操作

Connectable Observable有订阅时不开始发射事件消息,而是仅当调用它们的connect()方法时。这样就可以等待所有我们想要的订阅者都已经订阅了以后,再开始发出事件消息,这样能保证我们想要的所有订阅者都能接收到事件消息。其实也就是等大家都就位以后,开始发出消息。

publish

将一个正常的sequence转换成一个connectable sequence

replay

将一个正常的sequence转换成一个connectable sequence,然后和replaySubject相似,能接收到订阅之前的事件消息。

multicast

将一个正常的sequence转换成一个connectable sequence,并且通过特性的subject发送出去,比如PublishSubject,或者replaySubject,behaviorSubject等。不同的Subject会有不同的结果。

错误处理

catchErrorJustReturn

遇到error事件的时候,就return一个值,然后结束

catchError

捕获error进行处理,可以返回另一个sequence进行订阅

retry

遇见error事件可以进行重试,比如网络请求失败,可以进行重新连接

debug

debug

打印所有的订阅, 事件和disposals

RxSwift.Resources.total

查看RxSwift所有资源的占用

啊,文章终于结束,这篇文章比较长,基本上涵盖了官方文档所有的概念,其中不免有些错误与疏漏,希望能在你学习RxSwift的时候能有一些参考价值吧!!!

小伙伴们如果感觉文章对你有所帮助,可以关注博主博客

小伙伴们也可以关注博主微博,探索博主内心世界

如要转载请注明出处。

2 3 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部