Subject创建订阅Source
PublishSubject 最普通的subject,对它订阅的订阅者只会收到,后面发的值。如果对一个Complete/error的subject订阅,会马上收到complete/error。
BehaviorSubject 它的订阅者在订阅的时候会收到上一个event( error、complete、next)。创建时候需要一个初始值。
ReplaySubject 创建的时候用creat(buffferSize:Int)设置缓存的大小, 缓存的只缓存next。它的订阅者,在订阅的时候会马上收到缓存的next。如果订阅源是Complete/error,那么还会收到Complete/error。
Variable 是对behaviorSubject的封装。和behaviorSubject一样,创建提供一个初始值,它的订阅者也会马上收到上一个event。
1.不同的是它不需要手动complete(),当Variable销毁的时候系统会自动调用complete。2.放送event不用onNext(),而是通过对其属性value赋值
变换操作符
buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。订阅者收到的是一个数组。如果 缓存时间1S,个数 3。那么每缓冲3个就发出,如果一秒内不足3个也发送,一个都不用就发送[]。
window window操作符和 buffer十分相似。不过 buffer 是周期性的将缓存的元素集合发送出来,而 window周期性将元素集合以Observable 的形态发送出来。
map 很熟
flatMap flatMap操作符会对Observable的每一个元素转换成Observables,然后这些Observables的元素合并后再发送出来。即又将其“flat”降维成一个Observable序列
flatMapLatest flatMapLatest与 flatMap的唯一区别是:flatMapLatest只会接收最新 value的事件。
concatMap concatMap与 flatMap的唯一区别是:当前一个 observable 元素发送完毕后,后一个observable 才可以开始发出元素。或者说等待前一个 observable产生完成事件后,才对后一个 observable 进行订阅。
scan 就是先给一个初始值,然后不断的拿前一个的结果和最新的值进行处理操作。
groupBy 就是将源Observable分解为多个子Observable,然后将这些子Observable发送出来。
过滤操作符
filter 去除不满足给定条件的事件
distinctUntilChanged 过滤连续重复的事件
single 限制只发送一次事件,或者满足条件的第一个事件。如果存在有多个事件或者没有事件都发发出一个error事件。如果只有一个事件,则不会发出error事件
elementAt 该方法只处理在指定位置的事件
ignoreElements 忽略所有元素,只发error或complete事件
take 执行前几个事件
takeLast 执行后几个事件
Skip 跳过前几个事件
Sample 设置一个notifier。每当收到notifier事件,就从源序列去一个最新的事件并发送。二如果两次notifier事件之间没有源序列的事件,则不发送。
debounce debounce(0.5, scheduler: MainScheduler.instance)//只发送间隔超过0.5的元素。
条件操作符
amb 当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables
takeWhile 该方法依次判断Observable序列的每一个值是否满足给定的条件。当第一个不满足条件的值出现,它便Complete。
takeUntil 该方法设定另一个Observable,当这个Observable发出值或Complete,那么订阅源自动就完成
skipWhile 当满足给定的条件,就跳过发出的event。直到条件不满足的时候,开始执行,之后不会跳过
skipUntil 一直跳过,直到notifier发出值或Complete
结合操作操作符
startWith 在Observable序列开始之前插入一些事件元素。
merge 将多个Observable 合并成一个Observable,和flatMap{$0}一样
zip 将多个Observable压缩成。如:序列A,B,序列A的第一个值一定要与B的第一个值合并成新元素,一一相对应。这些新元素组成一个新的序列
combineLatest 于zip的区别:如序列A,B,序列A产生一个新的值,只需和B的当前最新的值合成就行,反之也行,不需要相对应。这些新元素组成一个新的序列。
withLatestFrom 序列A,B:A.withLatestFrom(B)....当A发出一个元素,就从B取出一个最新的元素并发送。
switchLatest switchLatest 有点像其他语言的switch方法,可以对事件流进行转换。
比如本来监听的 subject1,我可以通过更改variable 里面的value 更换事件源。变成监听subject2
和flatMapLatest{$0}一样
算数操作符
toArray 改操作符先把一个序列转成一个数组,并作为一个单一的事件发送,然后结束
reduce 接受一个初始值,和一个操作符。将给定的初始值,与序列里的每个值进行累计运算。得到一个最终结果,并将其作为单个值发送出去。
concat 会把多个Observavle序列合并(串联)为一个Observable序列。并且只有当前一个Observable序列发出一个completed事件,才会开始发送下一个Observable序列事件。与concatMap{$0}一样
连接操作
publish 将普通的序列转换成一个可连接的序列,同时该序列不会立刻发送事件,只有在调用connect之后才会开始
replay 与publish不同的:新的订阅者还能收到订阅之前的事件消息(数量由设置的bufferSize决定)
Multicaset 同样是将一个正常的序列转换成一个可连接的序列。同时muticase方法还可以传入一个subject,每当序列发送事件都会触发这个Subject也发送
refCount 将一个可被连接的序列转换成普通的序列。但是也还是会共享一个Observable源。
share(relay:) 是repaly于refCount结合。先用repaly,变成一个带缓存的可连接同步序列,再用refCount,变成一个普通带缓存的同步序列。同步的意思就是 -> 使得观察者共享源Observable
其他操作符
delay 使Observable延迟发送
delaySubscriptioin 是Observable延迟订阅
materialize 将一个Observable产生的event转换成元素,然后发送出去
dematerialize 与 materialize相反
Timeout 如果源Observable 在规定时间内没有发任何元素,就产生一个超时的error时间
using 使用 using 操作符创建 Observable 时,同时会创建一个可被清除的资源,一旦 Observable终止了,那么这个资源就会被清除掉了。
例子使用了do(onNext....)给序列添加订阅者的操作返回的但是序列,如果对这个序列订阅,只需Subscript()返回Disposable,就能执行do里面设置的操作。
Observable.using({() -> AnyDisposable in
return AnyDisposable(infiniteInterval$.subscribe()) //资源必须要用个遵守Disposable的class包裹
}) { (_) ->Observable
in return limited$ //返回一个序列
}.subscribe()
Swift - RxSwift的使用详解15(错误处理)
特征序列
Single 发送一个error,或者一个元素,应用场景网络请求
completable 发送一个error,或者是一个complete,应用场景本地存储
Maybe 发送一个error,或元素,或complete。