RxSwift笔记 - Observable 可观察序列

57 篇文章 1 订阅
23 篇文章 0 订阅


Observable - 可被监听的序列

Observable 用于描述元素异步产生的序列

page45image3835360.png

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> 的事件,可以说它就是一个“最正常”的事件;

page45image3831328.png

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

page46image1822208.png

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

page46image1820864.png


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 或者 .completedevent 后,它才被终结

方法 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

它介于SingleCompletable 之间,它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件。

  • 发出一个元素或者一个 completed 事件或者一个 error 事件
  • 不会共享状态变化

如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe


Driver

为简化 UI 层的代码产生的序列

  • 不会产生 error 事件
  • 一定在 MainScheduler 监听(主线程监听)
  • 共享状态变化

通过 .asDriver 方法将 ControlProperty 转换为 Driver


ControlEvent

专门用于描述 UI 控件所产生的事件,它具有以下特征:

  • 不会产生 error 事件
  • 一定在 MainScheduler 订阅(主线程订阅)
  • 一定在 MainScheduler 监听(主线程监听)
  • 共享状态变化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值