前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxSwift 系列(三) -- Combination Operators

RxSwift 系列(三) -- Combination Operators

作者头像
Scott_Mr
发布2018-05-16 16:07:01
8540
发布2018-05-16 16:07:01
举报
文章被收录于专栏:Scott_Mr 个人专栏

RxSwift 系列(三) -- Combination Operators

前言

本篇文章将要学习如何将多个Observables组合成一个ObservableCombination OperatorsRxSwift中的实现有五种:

  • startWith
  • merge
  • zip
  • combineLatest
  • switchLatest

startWith

Observable释放元素之前,发射指定的元素序列。更多详情 上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东西。 举个?:

代码语言:javascript
复制
let disposeBag = DisposeBag()
Observable.of(["C","C++","OC"]).startWith(["先吃饱饭再学习"]).subscribe({ (event) in
        print(event)
    }).disposed(by: disposeBag)

在我们发射["C","C++","OC"]之前,我们指定了发射["先吃饱饭再学习"],因此控制台上的打印结果是:

代码语言:javascript
复制
next(["先吃饱饭再学习"])
next(["C", "C++", "OC"])
completed

startWith和栈类似,先进后出。什么意思呢?你可以在上面的例子中再添加几个.startWith()试试。

merge

将多个Observable组合成单个Observable,并且按照时间顺序发射对应事件。更多详情

图1
图1

感觉和gitmerge操作是一样的效果。

代码语言:javascript
复制
let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
    
subject1.onNext("?️")
subject1.onNext("?️")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("?")
subject2.onNext("③")

zip

将多个Observable(注意:必须是要成对)组合成单个Observable,当有事件到达时,会在每个序列中对应的索引上对应的元素发出。(ps:之前版本的RxSwift好像最多只能组合8个Observable)更多详情

代码语言:javascript
复制
let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.zip(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
    
subject1.onNext("A")
subject1.onNext("B")
subject1.onNext("C")
    
subject2.onNext("1")
subject2.onNext("2")

上述代码,因为subject.onNext("C")没有与之对应的Observable,因此不会打印,让我们看看打印结果:

代码语言:javascript
复制
A--1
B--2

combineLatest

当一个项目由两个Observables发射时,通过一个指定的功能将每个Observable观察到的最新项目组合起来,并根据该功能的结果发射事件。更多详情

代码语言:javascript
复制
let disposeBag = DisposeBag()
    
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
    
Observable.combineLatest(subject1, subject2) { string1,string2 in
    "\(string1)--\(string2)"
    }.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
    
subject1.onNext("A")
    
subject2.onNext("1")
subject2.onNext("2")
    
subject1.onNext("B")
subject1.onNext("C")

输出结果:

代码语言:javascript
复制
A--1
A--2
B--2
C--2

图解:

图2
图2

switchLatest

切换Observable队列。

代码语言:javascript
复制
let disposeBag = DisposeBag()
    
let subject1 = BehaviorSubject(value: "1")
let subject2 = BehaviorSubject(value: "A")
    
let variable = Variable(subject1)
    
variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
subject1.onNext("2")
subject1.onNext("3")
    
variable.value = subject2
    
subject1.onNext("4")
subject2.onNext("B")

打印结果:

代码语言:javascript
复制
1
2
3
A
B

图解:

图3
图3

致谢

如果发现有错误的地方,欢迎评论,感谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RxSwift 系列(三) -- Combination Operators
    • 前言
      • startWith
        • merge
          • zip
            • combineLatest
              • switchLatest
                • 致谢
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档