一、订阅
创建了 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()
方法的 onNext
、onError
、 onCompleted
和 onDisposed
这四个回调都是有默认值的,所以这些方法不是必须的,可以选择执行某个方法.
//创建
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
看做一个容器, 将所有订阅行为存放到容器中, DisposeBag
在 dealloc
的时候,会对其中存储的所有订阅行为执行 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)