RxSwift之Observables
參考: ofollow,noindex">RxSwift-Reactive Programming with Swift (Swift4.0)
Observables
Observables
是 Rx
的核心,本節將花點時間學習如何建立和使用 Observables
。在 RxSwift
中, Observables
、 Observables sequence
和 sequence
代表相同的意思, 在 RxSwift
的世界裡,任何事物都是序列 。 observable
也是序列,它可以產生事件,事件可以包含值。
Observables三種狀態和生命週期
Observables
有三種狀態分別是 next
、 error
和 completed
。下面使用圓珠圖(marble diagram)理解 Observables
的生命週期。

上圖中從左到右的箭頭代表 時間 ,線上的圓珠代表序列事件元素。隨著時間的推移線上的元素會被依次發射。 observable
發射元素產生 next
事件。
另一張圓珠圖,它存在一個結束線。
此 observable
發射三個 tap
事件,當結束時會發個 completed
事件作為序列的結束標誌。例如: tap
所在的介面銷燬。在 observable
結束後不再發送任何事件,這種結束方式屬於正常終止。
另外,存在一種非正常方式結束序列,如出現錯誤時,如下面這張圖。

當錯誤傳送時, observable
發射 error
事件此時序列終止不再發射任何事件。
回顧一下上面三張圖:
隨著時間推移序列會根據元素依次傳送 next
事件,兩種情況導致序列結束,第一,發生錯誤發射 error
事件序列終止,第二,發射 completed
事件序列終止。序列一旦終止就不會再發射任何事件。
在 Swift
中,事件是列舉型別的結構如下:
/// 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
攜帶一個泛型Element
。 - ②:
error
攜帶一個Swift.Error
例項物件。 - ③:
completed
表示序列結束不攜帶值。
建立Observables
瞭解了 Observables
概念接下學習如何建立和使用 Observables
。
RxSwift
提供多種方式建立 Observables
。例如: of
, just
, from
, empty
, never
和 range
等。
just
: 建立單個事件的序列。 of
: 建立多個事件的序列。 from
: 通過陣列建立多個事件的序列。 empty
建立一個空的序列,只發射 completed
事件。 never
建立一個不發射事件也不會結束的序列。 range(start, count)
:建立包含多個事件的序列。
// 1. 建立Observables example(of: "just of from") { // 1 let one = 1 let two = 2 let three = 3 // 2 let observable1 = Observable.just(one) // 3 let observable2 = Observable.of(one, two, three) let observable3 = Observable.of([one, two, three]) // [Int] // 4 let observable4 = Observable.from([one, two, three]) let observable5 = Observable<Void>.empty() let observable6 = Observable<Any>.never() let observable7 = Observable.range(start: 1, count: 5) }
- 定義三個常量。
- 使用
just
建立只有一個元素的序列,此時序列型別為Observable<Int>
。 - 使用
of
建立序列,注意Observable2
是Observable<Int>
,而observable3
是Observable<[Int]>
型別 。 - 使用
from
建立序列,此時接收的引數是陣列型別。注意:與of
的區別。
除了前面的建立方式還可以使用 create
建立序列。
// Create方法,內部有一個observer example(of: "Create") { // 1 let disposeBag = DisposeBag() // 2 Observable<String>.create { observer in observer.onNext("1") observer.onCompleted() observer.onNext("2") // 3 return Disposables.create() } // 4 .subscribe( onNext: {print($0)}, onError: {print($0)}, onCompleted: {print("Completed")}, onDisposed: {print("Disposed")} ) // 5 .disposed(by: disposeBag) }
- 建立一個
DisposeBag
物件,用於管理序列 -
create
方法引數是一個逃逸閉包引數為AnyObserver
返回值Disposable
型別。AnyObserver
是通用型別用來將值新增到序列中,在將來發射給訂閱者。 - 返回
disposable
代表訂閱,Disposables.create()
建立了一個空的disposable
。 - 通過
subscribe
訂閱,執行結果你會發現沒有輸出2
,因為在onNext("2")
之前,已經發送completed
事件序列終止。 - 新增到
bag
中。
訂閱序列
訂閱序列使用 .subscribe
方法。直接看示例程式碼:
// 訂閱 example(of: "subscrible") { let one = 1 let two = 2 let three = 3 // 1 let observable = Observable.from([one ,two, three]) // 2 第一種 observable.subscribe { event in print(event)// 輸出事件 if let element = event.element { print(element) } } // 3 另一種方式 observable.subscribe(onNext: { (element) in print(element) }, onError: { (error) in print(error) }, onCompleted: { print("completed") }, onDisposed: { print("disposed") }) }
- 使用
from
建立有多個元素的序列。 - 使用
func subscribe(_ on: @escaping (Event<Int>) -> Void) -> Disposable
方法訂閱序列,逃逸閉包引數是Int
型別的事件。方法返回值是Disposable
。Disposable
稍後會學到。閉包中引數是事件,通過事件的可選值element
引數獲取值。 - 另一個方法相對方便,直接可以獲取到事件的值。注意:
onError
、onCompleted
和onDisposed
是可選的。
清除和終止
在 Observable
未被訂閱時,不會發射任何事件,當出現錯誤或結束時才會終止。不過,也可以通過清除訂閱來終止序列。
每一個訂閱者都存在一個 dispose
方法,當呼叫該方法時會清除訂閱者。示例程式碼:
// dispose 用於回收,防止記憶體洩露 example(of: "dispose") { let observable = Observable.of("A", "B", "C") let subscription = observable.subscribe {event in print(event) } subscription.dispose() } example(of: "DisposeBag") { let disposeBag = DisposeBag() Observable.of("A", "B", "C") .subscribe { print($0) } .disposed(by: disposeBag) }
-
DisposeBag
清除包,通過呼叫dispose
方法,取消訂閱並且釋放內部資源。 - 使用
dispose
可以避免記憶體洩露。
本節是對 RxSwift
中 Observable
概念和使用的初步學習,循序漸進逐步深入學習深層次內容。