五、訂閱 Observable
有了 Observable,我們還要使用 subscribe() 方法來訂閱它,接收它發(fā)出的 Event。
第一種用法:
(1)我們使用 subscribe() 訂閱了一個Observable 對象,該方法的 block 的回調(diào)參數(shù)就是被發(fā)出的 event 事件,我們將其直接打印出來。
let observable = Observable.of("A", "B", "C")
observable.subscribe { event in
print(event)
}
運行結(jié)果如下,可以看到:
- 初始化
Observable序列時設(shè)置的默認(rèn)值都按順序通過.next事件發(fā)送出來。 - 當(dāng)
Observable序列的初始數(shù)據(jù)都發(fā)送完畢,它還會自動發(fā)一個.completed事件出來。

(2)如果想要獲取到這個事件里的數(shù)據(jù),可以通過 event.element 得到。
let observable = Observable.of("A", "B", "C")
observable.subscribe { event in
print(event.element)
}
運行結(jié)果如下:

第二種用法:
(1)RxSwift 還提供了另一個 subscribe方法,它可以把 event 進行分類:
- 通過不同的
block回調(diào)處理不同類型的event。(其中onDisposed表示訂閱行為被dispose后的回調(diào),這個我后面會說) - 同時會把
event攜帶的數(shù)據(jù)直接解包出來作為參數(shù),方便我們使用。
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")
})
運行結(jié)果如下:

(2)subscribe() 方法的 onNext、onError、onCompleted 和 onDisposed 這四個回調(diào) block 參數(shù)都是有默認(rèn)值的,即它們都是可選的。所以我們也可以只處理 onNext而不管其他的情況。
let observable = Observable.of("A", "B", "C")
observable.subscribe(onNext: { element in
print(element)
})
運行結(jié)果如下:

六、監(jiān)聽事件的生命周期
1,doOn 介紹
(1)我們可以使用 doOn 方法來監(jiān)聽事件的生命周期,它會在每一次事件發(fā)送前被調(diào)用。
(2)同時它和 subscribe 一樣,可以通過不同的block 回調(diào)處理不同類型的 event。比如:
-
do(onNext:)方法就是在subscribe(onNext:)前調(diào)用 - 而
do(onCompleted:)方法則會在subscribe(onCompleted:)前面調(diào)用。
2,使用樣例
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)
1,Observable 從創(chuàng)建到終結(jié)流程
(1)一個 Observable 序列被創(chuàng)建出來后它不會馬上就開始被激活從而發(fā)出 Event,而是要等到它被某個人訂閱了才會激活它。
(2)而 Observable 序列激活之后要一直等到它發(fā)出了.error或者 .completed的 event 后,它才被終結(jié)。
2,dispose() 方法
(1)使用該方法我們可以手動取消一個訂閱行為。
(2)如果我們覺得這個訂閱結(jié)束了不再需要了,就可以調(diào)用 dispose()方法把這個訂閱給銷毀掉,防止內(nèi)存泄漏。
(3)當(dāng)一個訂閱行為被dispose 了,那么之后 observable 如果再發(fā)出 event,這個已經(jīng) dispose 的訂閱就收不到消息了。下面是一個簡單的使用樣例。
let observable = Observable.of("A", "B", "C")
//使用subscription常量存儲這個訂閱方法
let subscription = observable.subscribe { event in
print(event)
}
//調(diào)用這個訂閱的dispose()方法
subscription.dispose()
3,DisposeBag
(1)除了 dispose()方法之外,我們更經(jīng)常用到的是一個叫 DisposeBag 的對象來管理多個訂閱行為的銷毀:
- 我們可以把一個
DisposeBag對象看成一個垃圾袋,把用過的訂閱行為都放進去。 - 而這個
DisposeBag就會在自己快要dealloc的時候,對它里面的所有訂閱行為都調(diào)用dispose()方法。
(2)下面是一個簡單的使用樣例。
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)