文/iOS_Deve(简书作者)

原文链接:http://www.jianshu.com/p/429b5160611f

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

1.empty,它会发送一个Completed事件,创建一个不发射任何数据但是正常终止的Observable

// empty let emptySeq: Observable<Int> = empty() let subscription = emptySeq.subscribe { event in print(event) } // 输出Completed

2.never不会发送任何事件,创建一个不发射数据也不终止的Observable

// never let neverSeq: Observable<String> = never() let subscription = neverSeq.subscribe { event in print(event) } // 什么都没用打印

3.just,会先发送Next(Value),然后发送Completed,创建一个发射指定值的Observable。

Paste_Image.png

// just let justSeq = just("RxSwift") let subscription = justSeq.subscribe { event in print(event) } // 打印 // Next(RxSwift) // Completed

4.sequenceOf把一系列元素转换为事件

// sequenceOf let sequenceElements = sequenceOf(1, 2, 3, 4) let subscription = sequenceElements.subscribe { event in print(event) }

5.from通过asObservable,把其他数据类型转换为Observable

Paste_Image.png

// asObservable, 把序列转换成Observable let sequenceFromArray = [1, 2, 3, 4].asObservable() let subscription = sequenceFromArray.subscribe { event in print(event) } // 输出 // Next(1) // Next(2) // Next(3) // Next(4) // Completed

6.create,通过它重新创建一个Observable,通过.on发射Next和Completed事件

Paste_Image.png

// create创建序列,通过.on添加事件 let myCreate = { (element: Int) -> Observable<Int> in return create { observer in observer.on(.Next(element)) observer.on(.Completed) return NopDisposable.instance } } let subscription = myCreate(1).subscribe { event in print(event)
} // 输出 // Next(1) // Completed

7

// failWith,只会发送Error事件 let error = NSError(domain: "error", code: 1001, userInfo: nil) let errorSeq: Observable<Int> = failWith(error) let subscription = errorSeq.subscribe { event in print(event) } // 输出 // Error(Error Domain=error Code=1001 "(null)")

8.deferred直到有订阅者订阅才创建Observable,并为每一个订阅者创建一个新的Observable,在某些情况下,要等到最后一分钟才能获取到最新的数据,就需要这样做

Paste_Image.png

// deferred会等到有订阅者,订阅它才创建Observable let deferredSeq: Observable<Int> = deferred { print("create") return create { observer in observer.on(.Next(0)) observer.on(.Next(1)) observer.on(.Next(2)) return NopDisposable.instance } } deferredSeq.subscribe { event
in print(event) } /* create Next(0) Next(1) Next(2) */

Subjects

PublishSubject

// PublishSubject,会发送从订阅者,订阅之后的事件 let subject = PublishSubject<String>() subject.subscribe { event in print("1->\(event)") } subject.on(.Next("a")) subject.on(.Next("b")) subject.subscribe { event in print("2->\(event)") } subject.on(.Next("c")) //
输出 /* 1->Next(a) 1->Next(b) 1->Next(c) 2->Next(c) */

Paste_Image.png

BehaviorSubject

// BehaviorSubject它开始发射原始Observable最近发射的数据,然后继续发送其他来自Observable的数据 let subject = BehaviorSubject(value: "z") subject.subscribe { event in print("1->\(event)") } subject.on(.Next("a")) subject.on(.Next("b")) subject.subscribe { event in print("2->\(event)")
} subject.on(.Next("c")) subject.on(.Completed) // 输出 1->Next(a) 1->Next(b) 1->Next(c) 2->Next(c)

Paste_Image.png

ReplaySubject

// ReplaySubject,当有订阅者,订阅了的时候他能重发事件,bufferSize指定重发的次数,补发1次 let subject = ReplaySubject<String>.create(bufferSize: 1) subject.subscribe { event in print("1->\(event)") } subject.on(.Next("a")) subject.on(.Next("b")) subject.subscribe { event in print("2->\(event)")
} subject.on(.Next("c")) // 输出 /* 1->Next(a) 1->Next(b) 2->Next(b) 1->Next(c) 2->Next(c) */

Paste_Image.png

Transform

map

Paste_Image.png

// map,通过对Observable发射映射的函数对每一项做转换 let originalSeq = sequenceOf(1, 2, 3) originalSeq.map { $0 * 2 }.subscribe { print($0) } /* 输出 Next(2) Next(4) Next(6) Completed */

flatMap

// flatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable let seqInt = sequenceOf(1, 2, 3) let seqString = sequenceOf("a", "b", "c") seqInt.flatMap { int in seqString }.subscribe { print($0) } /* Next(a) Next(b) Next(c) Next(a) Next(b)
Next(c) Next(a) Next(b) Next(c) Completed */

scan

Paste_Image.png

// scan连续的对序列中的元素应用某一个元素。然后把结果作为下一次的输入 let seqToSum = sequenceOf(1, 2, 3, 4) seqToSum.scan(0) { (sum, ele) -> Int in sum + ele }.subscribe { print($0) } /* 输入 Next(1) Next(3) Next(6) */

Filtering

Paste_Image.png

// filter,过滤不符合要求的元素 let seq = sequenceOf(0, 1, 2, 3, 4, 5, 6, 7, 8) seq.filter { $0 % 2 == 0 } .subscribe { print($0) } /* 输出 Next(0) Next(2) Next(4) Next(6) Next(8) Completed */

distinct

// distinct,去掉相邻的相同元素 let seq = sequenceOf(1, 2, 2, 2, 3, 1, 1, 4, 1, 4) seq.distinctUntilChanged().subscribe { print($0) } /* 输出 Next(1) Next(2) Next(3) Next(1) Next(4) Next(1) Next(4) Completed */

take

// take保留前几项的数据 let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) } /* Next(1) Next(2) Next(3) Completed */

Combining(组合操作)

startWith

// startWith在数据序列前出入指定数据 let subscription = sequenceOf(2, 3, 4, 5).startWith(1).subscribe { print($0) } /* Next(1) Next(2) Next(3) Next(4) Next(5) Completed */

combineLatest

Paste_Image.png

// combineLatest,当两个Observables中任意一个发送了数据,使用一个函数把两个Observable中最近的数据进行结合 let stringOb = PublishSubject<String>() let intOb = PublishSubject<Int>() combineLatest(stringOb, intOb) { "\($0) \($1)" }.subscribe { print($0) } stringOb.on(.Next("A")) intOb.on(.Next(1))
stringOb.on(.Next("B")) stringOb.on(.Next("C")) /* Next(A 1) Next(B 1) Next(C 1) */

zip

Paste_Image.png

// zip它会等到Observable中的数据一一对应结合时,再发送数据 let stringOb = PublishSubject<String>() let intOb = PublishSubject<Int>() zip(stringOb, intOb) { "\($0) \($1)" }.subscribe { print($0) } stringOb.on(.Next("A")) stringOb.on(.Next("B")) intOb.on(.Next(1)) intOb.on(.Next(2))

merge

Paste_Image.png

// merge,合并对个Observables的发射物 let subject1 = PublishSubject<Int>() let subject2 = PublishSubject<Int>() sequenceOf(subject1, subject2).merge().subscribe { print($0) } subject1.onNext(1) subject2.onNext(2) subject1.onNext(3) /* Next(1) Next(2) Next(3) */

switchLatest

// switchLatest,将一个Observable<Observable<T>>转为为这样的Observable,它逐个发射数据的Observable let var1 = Variable(0) let var3 = Variable(var1) let d = var3.switchLatest().subscribe { print($0) }

RxSwift(一)的更多相关文章

  1. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...

  2. RxSwift 之官方文档

    RxSwift 官方文档结构 Introduction: Subjects Transforming Observables Filtering Observables Combining Obser ...

  3. ReactiveX序列——RxSwift 浅析

      ReactiveX序列——RxSwift Swift是苹果公司新推出的一门现代化的编程语言,并且将其开源出来了,Swift具有很多的优点,这也使得这门语言推出的短时间引起了很大反应的原因,在最近的 ...

  4. ReactiveCocoa / RxSwift 笔记一

    原创:转载请注明出处 ReactiveCocoa / RxSwift Native app有很大一部分的时间是在等待事件发生,然后响应事件,比如 1.等待网络请求完成, 2.等待用户的操作, 3.等待 ...

  5. RxSwift 入坑好多天 - 终于有了一点理解

    一.前言 江湖上都在说现在就要赶紧学 swift 了,即将是 swift 的天下了.在 api 变化不大的情况下,swift 作为一门新的语言,集众家之所长,普通编码确实比 oc 要好用的多了 老早就 ...

  6. RxSwift 系列(六) -- Mathematical and Aggregate Operators

    前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一 ...

  7. RxSwift 系列(五) -- Filtering and Conditional Operators

    前言 本篇文章将要学习RxSwift中过滤和条件操作符,在RxSwift中包括了: filter distinctUntilChanged elementAt single take takeLast ...

  8. RxSwift 系列(四) -- Transforming Operators

    前言 本篇文章将要学习RxSwift中四种转换操作符: map flatMap flatMapLatest scan map 通过使用一个闭包函数将原来的Observable序列转换为一个新的Obse ...

  9. RxSwift 系列(三) -- Combination Operators

    RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable. Combination Opera ...

  10. RxSwift 系列(二) -- Subject

    前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...

随机推荐

  1. .NET平台开源项目速览(21)Cron任务调度CronNET

    如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里 ...

  2. intellij idea快捷键字典

    最近在重装系统,在安装python IDE时候依然安装了sublime Text3和intellij Idea(冏,别问为什么没安装pycharm,0-0 逃).首先是已然将之前一直使用的sublim ...

  3. Qt下载地址

    上Qt官网http://www.qt.io/download/想下载Qt,速度很慢,在这里记录下在Qt官网看到的镜像下载地址: 1. 所有Qt版本下载地址: http://download.qt.io ...

  4. 聊聊Docker

    为什么是Docker 进入21世纪,继互联网之后,云计算开始大放异彩.云计算是互联网发展后期的必然方向,反过来,云计算也进一步推动了互联网的发展.云计算模式最关键的突破就是资源使用方式的改变. 云计算 ...

  5. JDBC控制事务

    概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...

  6. Java设计模式(六)Adapter适配器模式

    一.场景描述 “仪器数据采集器”包含采集数据以及发送数据给服务器两行为,则可定义“仪器数据采集器”接口,定义两方法“采集数据capture”和“发送数据sendData”. “PDF文件数据采集器”实 ...

  7. MongoDb进阶实践之一 如何在Linux(CentOS 7)上安装MongoDB

    一.NoSQL数据简介         1.NoSQL概念                   NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是 ...

  8. 背景新增属性和css渐变及倒影

    背景新增属性和css渐变及倒影 一.background新增属性 background-size:指定对象的背景图像的尺寸大小. background:url() 0 0,url() 0 100%;多 ...

  9. ssh 提示Connection closed by * 的解决方案

    使用ssh方式连接linux系统时,发现一直上报这个错误: Connection closed by 192.168.3.71 port 22 刚开始还以为是端口被防火墙禁止了呢,通过关闭和查看,并没 ...

  10. 笔记:Hibernate 查询缓存

    Hibernate 的一级缓存和二级缓存都是对实体进行缓存,他不会缓存普通属性,如果想对普通熟悉进行缓存,可以考虑使用查询缓存. 对于查询缓存来说,他缓存的Key就是查询所用的 HQL 或者 SQL ...