RXSwift_操作符

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 忽略所有元素,只发errorcomplete事件

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    序列AB: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<Int> in

            return  limited$ //返回一个序列

        }.subscribe()

Swift - RxSwift的使用详解15(错误处理)

特征序列

Single 发送一个error,或者一个元素,应用场景网络请求

completable 发送一个error,或者是一个complete,应用场景本地存储

Maybe 发送一个error,或元素,或complete。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容