在前一篇基礎之上,本文咱們將會介紹 RxSwift 中的 Observables 部分。html
在 RxSwift 中 Observable 也被稱爲 Observable Sequence、Sequence、Stream。Observable 會以異步的方式不斷的發射事件造成事件流,而且數據也會沿着事件流進行傳播。下圖是事件流的圖像化表示:編程
其中從左到右的箭頭表明時間軸,而三個圓圈則構成了可觀察序列。而整個過程會按照從左到右的順序。另外,事件可能在可觀察序列生命週期內的任意時刻被觸發。設計模式
上圖中的三個圓圈其實就是 RxSwift 中的 next 事件。除了 next 以外,RxSwift 中還有 completed 和 error 事件,而這二者都意味事件流生命週期的總結。數組
completed 所表示的正常終結:bash
error 所表示的異常終結:閉包
在源碼中這三類事件的定義以下:異步
/// Represents a sequence event.
///
/// Sequence grammar:
/// **next\* (error | completed)**
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
}複製代碼
在代碼中,咱們能夠清晰的看到 next 事件會攜帶一個實例進行傳播,error 事件會攜帶一個 Error 實例,completed 則什麼都不會攜帶。函數
在全部 Observable 對象的建立方法中,最簡單的就是 just :ui
// 1
let one = 1
let two = 2
let three = 3
// 2
let observable: Observable<Int> = Observable<Int>.just(one)複製代碼
做爲類方法 just 所建立的 Observable 對象只會包含一個元素。可是大多數時候,Observable 對象在其生命週期內會包含多個元素,而建立方法也很簡單:spa
let observable2 = Observable.of(one, two, three)複製代碼
可能上面的代碼會給人一種誤導,讓人以爲 observable2 中的數據多是一個數組類型。不過好在咱們能夠經過下面的代碼進行檢驗:
observable2.subscribe(onNext: { element in
print(element)
})
/* 打印結果: 1 2 3 */複製代碼
而真正建立數組類型變量的方法是:
let observable3 = Observable.of([one, two, three])
observable3.subscribe(onNext: { element in
print(element)
})
/* 打印結果: [1, 2, 3] */複製代碼
上面只是幾個經常使用的 Observable 建立方法,更多的內容能夠去查文檔和代碼。
在平常 iOS 編程中,通知模式能夠說是使用頻率至關高的一個設計模式。咱們經過 NotificationCenter 實現消息的廣播和訂閱。下面是一個典型的通知模式代碼用於處理 UIKeyboardDidChangeFrame 消息:
let observer = NotificationCenter.default.addObserver(
forName: .UIKeyboardDidChangeFrame,
object: nil,
queue: nil ) { notification in
// 閉包
}複製代碼
RxSwift 中的訂閱操做也很是簡單,只須要調用 subscribe 方法就好了。不過與 NotificationCenter 機制不一樣的是,RxSwift 中每個訂閱都是惟一的並無一個相似 default 這樣的全局單例對象。
更爲重要的是,在沒有訂閱者的時候 Observable 對象不會發送通知。另外, Observable 對象其實是一個序列,因此訂閱操做有點相似於反覆調用 Swift 標準庫裏中迭代器 Iterator 對象 next 函數:
let sequence = 0..<3
var iterator = sequence.makeIterator()
while let n = iterator.next() {
print(n)
}
/* 打印結果: 0 1 2 */複製代碼
不過 RxSwift 訂閱操做明顯比這個來的更直接,而且能夠一次實現對 next、error、completed 事件的的處理。一個簡單的訂閱操做示例:
let one = 1
let two = 2
let three = 3
let observable = Observable.of(one, two, three)
observable.subscribe { event in
print(event)
}複製代碼
上面代碼的訂閱操做很是簡單:打印出 observable 聲明週期內的全部事件。正常情形下,它的結果以下:
next(1)
next(2)
next(3)
completed複製代碼
固然,有時候咱們可能只是須要 observable 所發射的數據:
observable.subscribe { event in
if let element = event.element {
print(element)
}
}
/* 打印結果: 1 2 3 */複製代碼
又或者,咱們須要對不一樣事件區別處理:
observable .subscribe(
onNext: { element in
print(element)
},
onCompleted: {
print("Completed")
}
)複製代碼
Observable 對象只有在存在訂閱的情形下才會進行數據發送操做,並且會在 error 或 completed 事件觸發時結束其生命週期。可是,有時候咱們可能須要手動取消訂閱並提早終結 Observable 對象的生命。
let observable = Observable.of("A", "B", "C")
let subscription = observable.subscribe { event in
print(event)
}複製代碼
上面代碼很是簡單這裏就再也不細訴了,這裏咱們直接來看取消訂閱的操做。其實,取消訂閱的操做很是之簡單隻需一行代碼:
subscription.dispose()複製代碼
固然,手動對每個訂閱對象進行取消操做顯然是一件枯燥的工做。因此 RxSwift 爲你們提供了一個更爲簡單的方案。只需在訂閱時調用 .addDisposableTo() 添加一個 DisposeBag 類型對象,咱們就能在 DisposeBag 對象銷燬時取消全部綁定訂閱對象的取消動做。
let disposeBag = DisposeBag()
Observable.of("A", "B", "C")
.subscribe {
3 print($0)
}
.addDisposableTo(disposeBag)複製代碼
這裏咱們之因此須要進行 DisposeBag 對象綁定或者手動調用 dispose() 進行取消訂閱操做,是由於若是不這麼作的話 Observable 對象在生命週期完結時會存在內存泄漏的問題。
本文只是簡單的介紹了 Observables 一些常見基礎內容。這裏還有不少更深刻的內容沒有介紹,例如:empty 和 never 類型的訂閱、使用 Create 實現自定義 Observable 以及 Error 類型的自定義實現。若是你有興趣的話,我強烈建議你查閱官方文檔和代碼。
原文地址