1.RxSwift初识
RxSwift是 ReactiveX 的swift版本,是一种函数式响应编程的框架。RxSwift遵循Functional Reactive Programming(FRP)的设计规范,其目的是通过类似于信号流或者观察者的方式来实现代码的逻辑运算,使代码更加的简洁、明了。
2.RxSwift观察者模式
什么是观察者模式?相信学习ios的都知道,在ios众多的设计模式中有一种叫观察者的设计模式(即KVO),其目的在于通过发送通知的方式来进行相应的操作。举个例子:你在烧了一壶水,烧好了会听到按钮弹开的声音,这时你会去把水灌到热水瓶里。水壶就是被观察者,你是观察者,当水烧好了会给你发送按钮弹开的事件,这时你接收到通知,去执行把水灌到热水瓶里的操作。这就是RxSwift要告诉我们的观察者模式。
3.RxSwift基础知识
根据GitHub上下载的Rx.playground进行基础知识的学习,由于是英文的版本,我对基础知识进行了简要的翻译。项目地址:RxStudy
Observable和Observer
顾名思义,就是被观察者和观察者。Observable是被观察者,Observer是观察者。Observer(观察者)订阅(subscribe)Observable(被观察者),观察者就会受到被观察者发出的通知事件。
subscribe
subscribe就是观察者订阅被观察者的事件,比如next,error,completed事件。
DisposeBag
类似ios中的ARC,用于释放RxSwift中资源,防止内存泄露。
never
创建一个永不终止并且永不发送任何事件的序列
empty
创建一个只发送.Completed事件的空序列
just
创建一个只包含一个元素的序列
of
创建一个包含固定数量的元素的序列
from
创建一个SequenceType类型元素的序列(例如:Array, Dictionary, Set)
create
创建一个自定义的序列
range
创建一个可观察的序列,该序列释放一系列连续的整数,然后终止
repeatElement
创建一个可观察的序列,无限地释放给定的元素
generate
创建一个可观察的序列,只要提供的条件计算为true,则发出相应的事件。
deferred
为每个订阅者创建一个新的可观察序列。
error
创建一个可观察的序列,该序列不发出任何正常的事件,只发出error事件并结束。
doOn
为每个已发出的事件前调用一个副作用动作,并发出(通过)原始事件。
PublishSubject
在订阅时间内向所有观察者发送新事件。
ReplaySubject
发送新的事件给所有的观察者,并指定先前事件缓存区的大小给新的观察者。
BehaviorSubject
发送新的事件给所有的观察者,并向新的观察者发送最近的一个事件,没有则发送默认值。
Variable
BehaviorSubject的进一步封装,所以会发送最近的事件给新的订阅者。但不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete。
startWith
在从被观察者发送事件开始之前,先发送指定的元素序列。
merge
将两个可观察序列按照顺序组合在一起,形成一个新的可观察序列。
zip
将两个可观察序列按照顺序组合在一起,形成一个新的可观察序列,并一一对应。
combineLatest
如果存在最多不超过8条的事件序列,需要同时监听,那么每当有新的事件发生的时候,combineLatest 会将每个序列的最新的一个元素进行合并。
switchLatest
将可观察序列发出的事件转换成可观察的序列,并从最近的可观察序列中发送事件。
map
对每个元素都用函数做一次转换,挨个映射一遍。
flatMap and flatMapLatest
将可观察序列发射的元素转化为可观测序列,并将两个观察到的序列合并为一个可观察序列。这是有用的,例如,当你有一个可观察的序列,它本身发射的是可观察的序列,并且你希望能够从一个可观察的序列的新的事件作出反应。flatmap和flatmaplatest之间的区别是,flatmaplatest只会从最近的可观察序列内发射元素。
scan
有点像 reduce ,它会把每次的运算结果累积起来,作为下一次运算的输入值。
filter
只会让符合条件的元素通过。
distinctUntilChanged
抑制可观察序列发出的连续重复元素。
elementAt
只处理在指定位置的事件。
single
仅由可观察序列发出的第一个元素(或满足条件的第一个元素)。如果观察到的序列发射是不符合条件的一个元素,则会抛出一个错误。
take
从可观察序列的开始仅释放指定数量的元素。
takeLast
仅从可观察序列的结束处释放指定数量的元素。
takeWhile
只要指定的条件计算为true,从可观察序列的开始发出元素。
takeUntil
接收事件消息,直到另一个可观察序列发出事件消息的时候。
skip
禁止从可观察序列的开始发射指定数量的元素。
skipWhile
抑制从符合指定条件的可观察序列的开始发射元素。
skipWhileWithIndex
抑制从符合指定条件的可观察序列的开始发射元素,并释放剩余元素。闭包也传递了每个元素的索引。
skipUntil
直到某个可观察序列发出了事件消息,才开始接收当前序列发出的事件消息。
toArray
将可观察的序列转换为数组,将该数组作为新的元素通过可观察序列发出,然后终止。
reduce
从初始值开始,然后将累加器闭包应用于可观察序列发出的所有元素,并将聚合结果返回为单个元素可观察序列。
concat
concat会把多个序列和并为一个序列,并且当前面一个序列发出了completed事件,才会开始下一个序列的事件。
publish
将一个正常的序列转换成一个连接性的序列。
replay
将一个正常的序列转换成一个连接性的序列,然后和replaySubject相似,能接收到订阅之前的事件消息。
multicast
将一个正常的序列转换成一个连接性的序列,并且通过特性的subject发送出去,比如PublishSubject,或者replaySubject,behaviorSubject等。不同的Subject会有不同的结果。
catchErrorJustReturn
通过返回一个可观察到的序列,然后返回一个元素,然后终止。
catchError
可以捕获异常事件,并且在后面无缝接上另一段事件序列,丝毫没有异常的痕迹。
retry
顾名思义,就是在出现异常的时候会再去从头订阅事件序列,妄图通过『从头再来』解决异常,无限制。
retry maxAttemptCount
顾名思义,就是在出现异常的时候会再去从头订阅事件序列,妄图通过『从头再来』解决异常,设置最大值来限制重新订阅事件的次数。
debug
打印出所有订阅,事件和disposals。
RxSwift.Resources.total
查看RxSwift所有资源的占用,这对于在开发过程中的泄漏检测是有用的。
4.总结
以上是对RxSwift基础知识的学习和理解,虽然未应用到实际的项目中,但也是略有感悟。RxSwift是适合使用swift开发者使用的一套框架,如果你使用oc语言,可以参考ReactiveCocoa,ReactiveCocoa是以信号流的方式向我们阐述函数式响应框架的思维模式,当然ReactiveCocoa也有swift版本的,即ReactiveSwift。但我认为RxSwift更为适合,因为ReactiveX还包含了像RxJava,Rxjs等其他语言的版本,熟练掌握了其中的一种,在去学习其他的你会觉得似成相识的感觉。如果你致力于成为全栈型工程师,RxSwift将非常的适合你。