Observable - 可被监听的序列
Observable 用于描述元素异步产生的序列
Observable
这个类是 Rx
框架的核心,我们可以称它为可观察序列。
Rx 响应的是流(Stream)
,在 RxSwift
中,我们称之为 序列(sequence)
, 事实上,在这里 流 和 序列 是同一样东西。
Observable
的作用就是可以异步地产生一系列的 Event(事件)
,即一个 Observable<T>
对象会随着时间推移不定期地发出 event(element : T)
这样一个东西。
而且这些 Event
还可以携带数据,它的泛型 <T>
就是用来指定这个 Event
携带的数据的类型。
有了可观察序列,我们还需要有一个 Observer(订阅者)
来订阅它,这样这个订阅者才能收到 Observable<T>
不时发出的 Event
。
Observable
的生命周期
- 1、当序列发出
完成事件(Completed Event)
时,序列终止,不在发出数据 - 2、当序列发出
错误事件(Error Event)
时,序列终止,不在发出数据
Event 事件
查看 RxSwift
源码可以发现,事件 Event
的定义如下:
public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
可以看到 Event
就是一个枚举,也就是说一个 Observable
是可以发出 3 种不同类型的 Event
事件:
- next:就是那个可以携带数据
<T>
的事件,可以说它就是一个“最正常”的事件;
- error: 表示一个错误,它可以携带具体的错误内容,一旦 Observable 发出了 error event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了;
- completed: 表示 Observable 发出的事件正常地结束了,跟 error 一样,一旦 Observable 发出了 completed event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。
Observable订阅、事件监听、订阅销毁
一、订阅 Observable
使用 subscribe() 方法来订阅它,接收它发出的 Event
方法一:subscribe with event
// 创建序列(后续讲解序列的创建)
let observable = Observable.of("A", "B", "C")
// 序列的订阅
observable.subscribe { event in
print(event)
}
方法二:subscribe with onNext
方法的 onNext、onError、onCompleted 和 onDisposed 这四个回调 block 参数都是有默认值的,即它们都是可选的
// 创建序列(后续讲解序列的创建)
let observable = Observable.of("A", "B", "C")
// 序列的订阅
observable.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
二、监听事件的生命周期
- 使用
doOn
方法来监听事件的生命周期,它会在每一次事件发送前被调用 - 通过不同的
block
回调处理不同类型的event
比如:
do(onNext:) 方法就是在 subscribe(onNext:) 前调用
而 do(onCompleted:) 方法则会在 subscribe(onCompleted:) 前面调用
代码示例:
let observable = Observable.of("A", "B", "C")
observable
.do(onNext: { element in
print("Intercepted Next:", element)
}, onError: { error in
print("Intercepted Error:", error)
}, onCompleted: {
print("Intercepted Completed")
}, onDispose: {
print("Intercepted Disposed")
})
.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
三、Observable 的销毁(Dispose)
Observable 从创建到终结流程
- 一个 Observable
序列被创建出来后它不会马上就开始被激活从而发出 Event
,而是要等到它被某个人订阅了才会激活它
- 而 Observable
序列激活之后要一直等到它发出了 .error
或者 .completed
的 event
后,它才被终结
方法 1:dispose() 方法
- 使用该方法我们可以手动取消一个订阅行为
- 如果我们觉得这个订阅结束了不再需要了,就可以调用 dispose()
方法把这个订阅给销毁掉,防止内存泄漏
- 当一个订阅行为被 dispose
了,那么之后 observable
如果再发出 event
,这个已经 dispose
的订阅就收不到消息了
下面是一个简单的使用样例:
let observable = Observable.of("A", "B", "C")
// 使用subscription常量存储这个订阅方法
let subscription = observable.subscribe { event in
print(event)
}
// 调用这个订阅的dispose()方法销毁当前序列
subscription.dispose()
方法 2:DisposeBag
DisposeBag
对象可以看成一个内存存放包,把用过的订阅行为都放进去- 而这个
DisposeBag
就会在自己快要deinit
的时候,对它里面的所有订阅行为都调用dispose()
方法
let disposeBag = DisposeBag()
// 第1个Observable,及其订阅
let observable1 = Observable.of("A", "B", "C")
observable1.subscribe { event in
print(event)
}.disposed(by: disposeBag)
// 第2个Observable,及其订阅
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
print(event)
}.disposed(by: disposeBag)
特征序列
Observable 是所有序列的核心基础, 基于 Observable 添加一些特征,使其满足不同的场景或需求,同时使代码阅读更加准确。
Single
Single 是 Observable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件。
- 发出一个元素,或一个 error 事件
- 不会共享状态变化
一个比较常见的例子就是执行 HTTP
请求,然后返回一个应答或错误。不过你也可以用 Single
来描述任何只有一个元素的序列。
对 Observable
调用 .asSingle()
方法,将它转换为 Single
。
Completable
它不像 Observable 可以发出多个元素,它要么只能产生一个 completed 事件,要么产生一个 error 事件。
- 发出零个元素
- 发出一个
completed
事件或者一个error
事件 - 不会共享状态变化
Completable
适用于那种你只关心任务是否完成,而不需要在意任务返回值的情况。
它和 Observable<Void>
有点相似。
Maybe
它介于
Single
和Completable
之间,它要么只能发出一个元素,要么产生一个completed
事件,要么产生一个error
事件。
- 发出一个元素或者一个 completed 事件或者一个 error 事件
- 不会共享状态变化
如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe
。
Driver
为简化 UI 层的代码产生的序列
- 不会产生 error 事件
- 一定在 MainScheduler 监听(主线程监听)
- 共享状态变化
通过 .asDriver
方法将 ControlProperty
转换为 Driver
ControlEvent
专门用于描述 UI 控件所产生的事件,它具有以下特征:
- 不会产生 error 事件
- 一定在 MainScheduler 订阅(主线程订阅)
- 一定在 MainScheduler 监听(主线程监听)
- 共享状态变化