Observable 是 Rx 的根基

官网:http://reactivex.io/

github地址:https://github.com/ReactiveX/RxSwift

  • Observable<T> 这个类就是 Rx 框架的基础,我们可以称它为可观察序列。它的作用就是可以异步地产生一系列的 Event(事件),即一个 Observable<T> 对象会随着时间推移不定期地发出 event(element : T) 这样一个东西。
  • 而且这些 Event 还可以携带数据,它的泛型 <T> 就是用来指定这个 Event 携带的数据的类型。
  • 有了可观察序列,我们还需要有一个 Observer(订阅者)来订阅它,这样这个订阅者才能收到 Observable<T> 不时发出的 Event。

查看 RxSwift 源码可以发现,事件 Event 的定义如下:

  1. public enum Event<Element> {
  2. /// Next element is produced.
  3. case next(Element)
  4.  
  5. /// Sequence terminated with an error.
  6. case error(Swift.Error)
  7.  
  8. /// Sequence completed successfully.
  9. case completed
  10. }

官方文档如下:

onNext:
An Observable calls this method whenever the Observable emits an item. This method takes as a parameter the item emitted by the Observable.
next 事件就是那个可以携带数据 <T> 的事件,可以说它就是一个“最正常”的事件。
onError:
An Observable calls this method to indicate that it has failed to generate the expected data or has encountered some other error. It will not make further calls to onNext or onCompleted. The onError method takes as its parameter an indication of what caused the error.

error 事件表示一个错误,它可以携带具体的错误内容,一旦 Observable 发出了 error event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。

onCompleted:
An Observable calls this method after it has called onNext for the final time, if it has not encountered any errors.

completed 事件表示 Observable 发出的事件正常地结束了,跟 error 一样,一旦 Observable 发出了 completed event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。

  1. /*
  2. (1)该方法通过传入一个默认值来初始化。
  3. (2)下面样例我们显式地标注出了 observable 的类型为 Observable<Int>,
  4. 即指定了这个 Observable 所发出的事件携带的数据类型必须是 Int 类型的。
  5. */
  6. let justObservable = Observable<Int>.just(5)
  7. /*
  8. (1)该方法可以接受可变数量的参数(必需要是同类型的)
  9. (2)下面样例中我没有显式地声明出 Observable 的泛型类型,Swift 也会自动推断类型。
  10. */
  11. let ofObservable = Observable.of("a","b","c")
  12. /*
  13. (1)该方法需要一个数组参数。
  14. (2)下面样例中数据里的元素就会被当做这个 Observable 所发出 event 携带的数据内容,最终效果同上面饿 of() 样例是一样的。
  15. */
  16. let fromObservable = Observable.from(["a","b","c"])
  17. //该方法创建一个永远不会发出 Event(也不会终止)的 Observable 序列。
  18. let emptyObservable = Observable<Int>.never()
  19.  
  20. //该方法创建一个不做任何操作,而是直接发送一个错误的 Observable 序列。
  21. enum Myerro:Error{
  22. case A
  23. case B
  24. }
  25. let erroObservable = Observable<Int>.error(Myerro.A)
  26. /*
  27. (1)该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的 Observable 序列。
  28. (2)下面样例中,两种方法创建的 Observable 序列都是一样的。
  29. */
  30. let rangeAbservale = Observable.range(start: 1, count: 5)
  31. let ofObservale = Observable.of(1,2,3,4,5)
  32. //该方法创建一个可以无限发出给定元素的 Event 的 Observable 序列(永不终止)。
  33. let repeatElementObservale = Observable.repeatElement(1)
  34.  
  35. /*
  36. (1)该方法创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列。
  37. (2)下面样例中,两种方法创建的 Observable 序列都是一样的。
  38. */
  39. let generrateObserval = Observable.generate(initialState: 0,
  40. condition: {$0 <= 10},
  41. iterate: {$0 + 2})
  42. let ofObservale1 = Observable<Int>.of(1,2,4,6,8,10)
  43. /*
  44. (1)该方法接受一个 block 形式的参数,任务是对每一个过来的订阅进行处理。
  45. (2)下面是一个简单的样例。为方便演示,这里增加了订阅相关代码。
  46. */
  47. //这个block有一个回调参数observer就是订阅这个Observable对象的订阅者
  48. //当一个订阅者订阅这个Observable对象的时候,就会将订阅者作为参数传入这个block来执行一些内容
  49. let creatObservale = Observable<String>.create { observer in
  50. //对订阅者发出了.next事件,且携带了一个数据"hangge.com"
  51. observer.onNext("mapanguan")
  52. //对订阅者发出了.completed事件
  53. observer.onCompleted()
  54. //因为一个订阅行为会有一个Disposable类型的返回值,所以在结尾一定要returen一个Disposable
  55. return Disposables.create()
  56. }
  57.  
  58. creatObservale.subscribe{
  59. print($0)
  60. }
  61.  
  62. /*
  63. (1)该个方法相当于是创建一个 Observable 工厂,通过传入一个 block 来执行延迟 Observable 序列创建的行为,而这个 block 里就是真正的实例化序列对象的地方。
  64. (2)下面是一个简单的演示样例:
  65. */
  66.  
  67. var isOdd = true
  68. //使用deferred()方法延迟Observable序列的初始化,通过传入的block来实现Observable序列的初始化并且返回。
  69. let deferredObserval = Observable<Int>.deferred { () -> Observable<Int> in
  70. //让每次执行这个block时候都会让奇、偶数进行交替
  71. isOdd = !isOdd
  72. if isOdd{
  73. return Observable.of(1,3,5,7,9)
  74. }else{
  75. return Observable.of(2,4,6,8,10)
  76. }
  77. }
  78.  
  79. deferredObserval.subscribe { (event) in
  80. print("frist",event)
  81. }
  82.  
  83. deferredObserval.subscribe { (event) in
  84. print("second",event)
  85. }
  86.  
  87. /*
  88. (1)这个方法创建的 Observable 序列每隔一段设定的时间,会发出一个索引数的元素。而且它会一直发送下去。
  89. (2)下面方法让其每 1 秒发送一次,并且是在主线程(MainScheduler)发送。
  90. */
  91. let intervalObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
  92. intervalObserval.subscribe { (event) in
  93. print(event)
  94. }
  95.  
  96. //这个方法有两种用法,一种是创建的 Observable 序列在经过设定的一段时间后,产生唯一的一个元素。相当于repeat = false
  97. let timerObserval = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
  98. timerObserval.subscribe { (event) in
  99. print(event)
  100. }
  101. //另一种是创建的 Observable 序列在经过设定的一段时间后,每隔一段时间产生一个元素。相当于repeat = true
  102. let timer2Observal = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)
  103. timer2Observal.subscribe { (event) in
  104. print(event)
  105. }

  

RxSwift学习笔记2:Observable/生命周期/Event/oneNext/onError/onCompleted/的更多相关文章

  1. RxSwift学习笔记3:生命周期/订阅

    有了 Observable,我们还要使用 subscribe() 方法来订阅它,接收它发出的 Event. let observal = Observable.of("a",&qu ...

  2. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  3. IOS学习笔记37——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

  4. Maven学习笔记(六):生命周期与插件

    何为生命周期:      Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...

  5. Spring4学习笔记 - Bean的生命周期

    1 Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1)通过构造器或工厂方法创建 Bean 实例 2)为 Bean 的属性设置值和对其他 Bean 的引用 3)调用 Bean 的初 ...

  6. Android之Fragment学习笔记②(Fragment生命周期)

    一. Fragment生命周期图                                  二.Fragment生命周期方法介绍 Fragment的生命周期和activity生命周期很像,其生 ...

  7. android学习笔记28——Activity生命周期

    Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...

  8. Android学习笔记:Activity生命周期详解

    进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...

  9. ios学习笔记之UIViewControl生命周期

    提到UIViewcontrol,每个人都不会陌生吧!平时实际开发中,每天的实际开发应该都少不了它.学过android的各位亲,也对生命周期这四个字并不陌生,无论是activity,还是service, ...

随机推荐

  1. 错误:在非结构或联合中请求成员‘next’

    #include <stdio.h> #include <stdlib.h> #define ElemType int #define Status int #define O ...

  2. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  3. qt 5.2.1类和模块的关系图

    QT│  ├─ActiveQt│  │  ActiveQt│  │  ActiveQtDepends│  │  ActiveQtVersion│  │  QAxAggregated│  │  QAxB ...

  4. Python 反射机制

    Python的反射机制 Python的反射机制,就是反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员 ...

  5. JS在页面根据数量改变总价及按钮进行格式验证

    分两部分,第一部分是在页面上,根据数量的input标签内容,动态更新总价标签的内容,代码如下: <script type="text/javascript"> $(do ...

  6. js 正则表达式,匹配邮箱/手机号/用户名

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. CSS-表格特有属性和定位

    1.表格特有属性 1.边框合并 属性:border-collapse 取值: 1.separate 默认值,即分离边框模式 2.collapse 边框合并 2.边框边距 作用:设置单元格之间或单元格与 ...

  8. 经典矩阵快速幂之一-----poj3233(矩阵套矩阵

    题意:给你一个矩阵A,求S=A+A^2+A^3+...+A^k. 其实这个当时我看着毫无头绪,看了他们给的矩阵发现好!精!妙! 我们这样看 是不是有点思路! 没错!就是右上角,我们以此类推可以得到A+ ...

  9. canvas 实现弹跳效果

    一:创建画布 <canvas width="600" height="600" id="canvas"></canvas& ...

  10. 2018.11.17 codechef PRIMEDST(点分治+fft)

    传送门 fftfftfft一眼题(其实最先想到的是nttnttntt,wawawa了几次之后发现模数不够大果断弃疗写fftfftfft) 我们点分治统计答案的个数. 考虑现在已经统计出了到当前点的所有 ...