RxSwift 结合操作符

结合操作(或者称合并操作)指的是将多个Observable序列进行组合,拼装成一个新的Observable序列。

1. startWith

该方法会在Observable序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息。

image.png

let disposeBag = DisposeBag()

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

结果如下:

1
2
3

2. concat

  • concat操作符将多个Observables按顺序串联起来,当前一个Observable元素发送完毕后,后一个 Observable 才可以开始发出元素。
  • concat将等待前一个 Observable 产生完成事件后,才对后一个Observable进行订阅。如果后一个是“热”Observable,在它前一个Observable产生完成事件前,所产生的元素将不会被发送出来。
image.png
et disposeBag = DisposeBag()

let subject1 = BehaviorSubject.init(value: "1")
let subject2 = BehaviorSubject.init(value: "A")
        
let variable = Variable.init(subject1)
variable.asObservable()
        .concat()
        .subscribe{ print($0) }
        .disposed(by: disposeBag)

subject1.onNext("2")
subject1.onNext("3")

variable.value = subject2
subject2.onNext("I would be ignored")
subject2.onNext("B")

subject1.onCompleted()
subject2.onNext("C")

结果如下:

next(1)
next(2)
next(3)
next(B)
next(C)

3. merge

  • 通过使用merge操作符你可以将多个Observables合并成一个,当某一个Observable发出一个元素时,他就将这个元素发出。
  • 如果,某一个Observable发出一个onError事件,那么被合并的Observable也会将它发出,并且立即终止序列。
    image.png
let disposeBag = DisposeBag()

let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()

Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

subject1.onNext(20)
subject1.onNext(40)
subject1.onNext(60)
subject2.onNext(1)
subject1.onNext(80)
subject1.onNext(100)
subject2.onNext(1)

结果如下:

20
40
60
1
80
100
1

4. zip

zip操作符将多个(最多不超过8个)Observables的元素通过一个函数组合起来,然后将这个组合的结果发出来。它会严格的按照序列的索引数进行组合。例如,返回的Observable的第一个元素,是由每一个源Observables的第一个元素组合出来的。它的第二个元素 ,是由每一个源Observables的第二个元素组合出来的。它的第三个元素 ,是由每一个源Observables的第三个元素组合出来的,以此类推。它的元素数量等于源Observables中元素数量最少的那个。

image.png

let disposeBag = DisposeBag()

let first = PublishSubject<String>()
let second = PublishSubject<String>()

Observable.zip(first, second) { $0 + $1 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

first.onNext("1")
second.onNext("A")
first.onNext("2")
second.onNext("B")
second.onNext("C")
second.onNext("D")
first.onNext("3")
first.onNext("4")

结果如下:

1A
2B
3C
4D

5. combineLatest

combineLatest操作符将多个Observables中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。这些源Observables中任何一个发出一个元素,他都会发出一个元素(前提是,这些Observables曾经发出过元素)。

image.png

let disposeBag = DisposeBag()

let first = PublishSubject<String>()
let second = PublishSubject<String>()

Observable.combineLatest(first, second) { $0 + $1 }
          .subscribe(onNext: { print($0) })
          .disposed(by: disposeBag)

first.onNext("1")
second.onNext("A")
first.onNext("2")
second.onNext("B")
second.onNext("C")
second.onNext("D")
first.onNext("3")
first.onNext("4")

结果如下:

1A
2A
2B
2C
2D
3D
4D

6. withLatestFrom

withLatestFrom操作符将两个Observables中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。当第一个Observable发出一个元素时,就立即取出第二个Observable中最新的元素,通过一个组合函数将两个最新的元素合并后发送出去。

image.png

let disposeBag = DisposeBag()
 
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
 
subject1.withLatestFrom(subject2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext("A")
subject2.onNext("1")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("2")
subject1.onNext("D")

结果如下:

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

推荐阅读更多精彩内容