RxSwift(三) - Observable订阅、监听、销毁

一、订阅

创建了 Observable 序列, 还需要用 subscribe() 方法来订阅它,以接收该序列发出的 Event .

  • 订阅方法一

(1) 使用 subcribe() 订阅 Observable 对象, 用 block 来接收 Event 事件

//创建
let observable  = Observable.of("A","B");
//订阅
observable.subscribe { event in
    print(event);
}

//输出结果
next(A)
next(B)
completed

(2) 使用 event.element 来获取事件中的数据

//创建
let observable  = Observable.of("A","B");
//订阅
observable.subscribe { event in
    print(event.element);//输出数据
}

//输出结果
Optional("A")
Optional("B")
nil
  • 订阅方法二

(1) RxSwift 还提供另一个 subscribe 方法, 可以将 Event 进行分类, 通过不同的 闭包 回调处理不同类型的 Event, 同时会把 Event 携带的数据直接解包出来作为参数

//创建
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") // onDisposed 表示订阅行为被 dispose 后的回调
})

//输出结果
A
B
C
completed
disposed

(2) subscribe() 方法的 onNextonErroronCompletedonDisposed 这四个回调都是有默认值的,所以这些方法不是必须的,可以选择执行某个方法.

//创建
let observable  = Observable.of("A","B","C");
//订阅
observable.subscribe(onNext: { (element) in
    print(element)
})

//输出结果
A
B
C

二、监听事件的声明周期

  • doOn

(1) 使用 doOn 来监听事件的声明周期, 会在每次事件发送之前被调用

(2) 和 subscribe 事件一样, 可以通过不同的闭包回调来区分 Event 事件类型, 比如 : do(onNext:) 方法在 subscribe(onNext:) 之前调用.

let observable = Observable.of("A","B","C")
observable.do(onNext: { (element) in
    print("-- \(element)")
}, onError: { (error) in
    print("-- error")
}, onCompleted: {
    print("-- completed")
}, onSubscribe: {
    print("-- subscribe1")
}, onSubscribed: {
    print("-- subscribe2")
}, onDispose: {
    print("-- disposed")
})
.subscribe(onNext: { (element) in
    print(element)
}, onError: { (error) in
    print(error)
}, onCompleted: {
    print("completed")
}, onDisposed: {
    print("disposed")
})

//输出结果
-- subscribe1
-- subscribe2
-- A
A
-- B
B
-- C
C
-- completed
completed
disposed
-- disposed

Observable 销毁(Dispose)

  • Observable 从创建到销毁流程

(1) 一个 Observable 序列被创建出来后,不会马上被激活发送 Event, 而是等到它被订阅后才会被激活.
(2) Observable 激活之后, 一直等到它发出 .error 或者 .completed 之后, 才会被销毁

  • dispose()

(1) 使用该方法可以手动取消一个订阅行为

(2) 如果一个订阅行为被 dispose 了, Observable 序列再发出 Event, 订阅者不会受到消息

  • DisposeBag

除了 dispose() 方法之外, 还可以使用 DisposeBag 对象来管理多个订阅的销毁行为, 我们可以把 DisposeBag 看做一个容器, 将所有订阅行为存放到容器中, DisposeBagdealloc 的时候,会对其中存储的所有订阅行为执行 dispose() 方法进行销毁.

let disposeBag = DisposeBag()
let observable1 = Observable.of("A","B");
observable1.subscribe { (event) in
    print(event)
}.disposed(by: disposeBag)
let observable2 = Observable.of("A","B");
observable2.subscribe { (event) in
    print(event)
}.disposed(by: disposeBag)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容