[iOS] RxSwift之Observables

[iOS] RxSwift之Observables
镇长Observables
Observables是Rx的核心,本节将花点时间学习如何创建和使用Observables。在RxSwift中,Observables、Observables sequence和sequence代表相同的意思,在RxSwift的世界里,任何事物都是序列。observable也是序列,它可以产生事件,事件可以包含值。
Observables三种状态和生命周期
Observables有三种状态分别是next、error和completed 。下面使用圆珠图(marble diagram)理解Observables的生命周期。
上图中从左到右的箭头代表时间,线上的圆珠代表序列事件元素。随着时间的推移线上的元素会被依次发射。observable发射元素产生next事件。
另一张圆珠图,它存在一个结束线。
此observable发射三个tap事件,当结束时会发个completed事件作为序列的结束标志。例如:tap所在的界面销毁。在observable结束后不再发送任何事件,这种结束方式属于正常终止。
另外,存在一种非正常方式结束序列,如出现错误时,如下面这张图。
当错误发送时,observable发射error事件此时序列终止不再发射任何事件。
回顾一下上面三张图:
随着时间推移序列会根据元素依次发送next事件,两种情况导致序列结束,第一,发生错误发射error事件序列终止,第二,发射completed事件序列终止。序列一旦终止就不会再发射任何事件。
在Swift中,事件是枚举类型的结构如下:
1 | /// Represents a sequence event. |
- ① :
next携带一个泛型Element。 - ②:
error携带一个Swift.Error实例对象。 - ③:
completed表示序列结束不携带值。
创建Observables
了解了Observables概念接下学习如何创建和使用Observables。
RxSwift提供多种方式创建Observables。例如:of, just, from, empty, never和range等。
just: 创建单个事件的序列。of: 创建多个事件的序列。from: 通过数组创建多个事件的序列。empty创建一个空的序列,只发射completed事件。never创建一个不发射事件也不会结束的序列。range(start, count):创建包含多个事件的序列。
1 | // 1. 创建Observables |
- 定义三个常量。
- 使用
just创建只有一个元素的序列,此时序列类型为Observable<Int>。 - 使用
of创建序列,注意Observable2是Observable<Int>,而observable3是Observable<[Int]>类型 。 - 使用
from创建序列,此时接收的参数是数组类型。注意:与of的区别。
除了前面的创建方式还可以使用create创建序列。
1 | // Create方法,内部有一个observer |
- 创建一个
DisposeBag对象,用于管理序列 create方法参数是一个逃逸闭包参数为AnyObserver返回值Disposable类型。AnyObserver是通用类型用来将值添加到序列中,在将来发射给订阅者。- 返回
disposable代表订阅,Disposables.create()创建了一个空的disposable。 - 通过
subscribe订阅,运行结果你会发现没有输出2,因为在onNext("2")之前,已经发送completed事件序列终止。 - 添加到
bag中。
订阅序列
订阅序列使用.subscribe方法。直接看示例代码:
1 | // 订阅 |
- 使用
from创建有多个元素的序列。 - 使用
func subscribe(_ on: @escaping (Event<Int>) -> Void) -> Disposable方法订阅序列,逃逸闭包参数是Int类型的事件。方法返回值是Disposable。Disposable稍后会学到。闭包中参数是事件,通过事件的可选值element参数获取值。 - 另一个方法相对方便,直接可以获取到事件的值。注意:
onError、onCompleted和onDisposed是可选的。
清除和终止
在Observable未被订阅时,不会发射任何事件,当出现错误或结束时才会终止。不过,也可以通过清除订阅来终止序列。
每一个订阅者都存在一个dispose方法,当调用该方法时会清除订阅者。示例代码:
1 | // dispose 用于回收,防止内存泄露 |
DisposeBag清除包,通过调用dispose方法,取消订阅并且释放内部资源。- 使用
dispose可以避免内存泄露。
本节是对RxSwift中Observable概念和使用的初步学习,循序渐进逐步深入学习深层次内容。
小结
Observables是什么?生命周期?Observables创建方法有哪些?- 如何订阅
Observable? DisposeBag是什么?它的作用是什么?













