一、訂閱
創(chuàng)建了 Observable 序列, 還需要用 subscribe() 方法來訂閱它,以接收該序列發(fā)出的 Event .
- 訂閱方法一
(1) 使用 subcribe() 訂閱 Observable 對象, 用 block 來接收 Event 事件
//創(chuàng)建
let observable = Observable.of("A","B");
//訂閱
observable.subscribe { event in
print(event);
}
//輸出結(jié)果
next(A)
next(B)
completed
(2) 使用 event.element 來獲取事件中的數(shù)據(jù)
//創(chuàng)建
let observable = Observable.of("A","B");
//訂閱
observable.subscribe { event in
print(event.element);//輸出數(shù)據(jù)
}
//輸出結(jié)果
Optional("A")
Optional("B")
nil
- 訂閱方法二
(1) RxSwift 還提供另一個 subscribe 方法, 可以將 Event 進(jìn)行分類, 通過不同的 閉包 回調(diào)處理不同類型的 Event, 同時會把 Event 攜帶的數(shù)據(jù)直接解包出來作為參數(shù)
//創(chuàng)建
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 后的回調(diào)
})
//輸出結(jié)果
A
B
C
completed
disposed
(2) subscribe() 方法的 onNext、onError、 onCompleted 和 onDisposed 這四個回調(diào)都是有默認(rèn)值的,所以這些方法不是必須的,可以選擇執(zhí)行某個方法.
//創(chuàng)建
let observable = Observable.of("A","B","C");
//訂閱
observable.subscribe(onNext: { (element) in
print(element)
})
//輸出結(jié)果
A
B
C
二、監(jiān)聽事件的聲明周期
- doOn
(1) 使用 doOn 來監(jiān)聽事件的聲明周期, 會在每次事件發(fā)送之前被調(diào)用
(2) 和 subscribe 事件一樣, 可以通過不同的閉包回調(diào)來區(qū)分 Event 事件類型, 比如 : do(onNext:) 方法在 subscribe(onNext:) 之前調(diào)用.
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")
})
//輸出結(jié)果
-- subscribe1
-- subscribe2
-- A
A
-- B
B
-- C
C
-- completed
completed
disposed
-- disposed
Observable 銷毀(Dispose)
- Observable 從創(chuàng)建到銷毀流程
(1) 一個 Observable 序列被創(chuàng)建出來后,不會馬上被激活發(fā)送 Event, 而是等到它被訂閱后才會被激活.
(2) Observable 激活之后, 一直等到它發(fā)出 .error 或者 .completed 之后, 才會被銷毀
- dispose()
(1) 使用該方法可以手動取消一個訂閱行為
(2) 如果一個訂閱行為被 dispose 了, Observable 序列再發(fā)出 Event, 訂閱者不會受到消息
- DisposeBag
除了 dispose() 方法之外, 還可以使用 DisposeBag 對象來管理多個訂閱的銷毀行為, 我們可以把 DisposeBag 看做一個容器, 將所有訂閱行為存放到容器中, DisposeBag 在 dealloc 的時候,會對其中存儲的所有訂閱行為執(zhí)行 dispose() 方法進(jìn)行銷毀.
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)