每一個 Observable 就只是一個序列(Sequence)而已。

subscribe 一個 observable,以訂閱UISlider為例,當滑動UISlider時值改變就會通知訂閱(subscride)的人。

建立Observables

建立一個只有一個 element,值為1的observable

let observable = Observable.just(1)

建立一個三個element,型別為int的observable

let observable2 = Observable.of(1,2,3)

建立一個只有一個element,為int陣列的observable

let observable3 = Observable.of([1,2,3])

用from遍歷陣列中每一個element,相當於observable2

let observable4 = Observable.from([1,2,3])

建立Subscriptions

observable4.subscribe { event in
    print(event)
}
/// 印出結果
next(1)
next(2)
next(3)
completed
/// 取得Observable中的值
observable4.subscribe { event in
    if let element = event.element {
        print(element)
    }
}

/// 較簡易取得element的方法
observable4.subscribe(onNext: { element in
    print(element)
})
/// 印出結果
1
2
3
observable3.subscribe { event in
    print(event)
}
/// 印出結果
next([1, 2, 3])
completed

取得Observable中的值

observable3.subscribe(onNext: { element in
    print(element)
})
/// 印出結果
[1, 2, 3]

Event - 事件

enum Event<Element> {
		case next(Element)
		case error(Swift.Error)
		case completed
}
  • next:序列產生一個新的元素
  • completed:序列的所有元素都成功產生,整個序列已經完成
  • error:創建序列時產生了一個錯誤,導致序列終止

Disposing

Observable 有被訂閱(subscribe),表示建立了訂閱者一直在觀察這個序列,因此當序列完成需要適當的 dispose 這些 subscriptions,否則會產生memory leak。

針對單個訂閱做dispose

let subscription4 = observable4.subscribe(onNext: { element in
    print(element)
})

subscription4.dispose()

使用disposeBag,當序列完成自動進行dispose

let disposeBag = DisposeBag()
Observable.of("A", "B", "C")
    .subscribe {
        print($0)
    }.disposed(by: disposeBag)

另一種創建序列及訂閱的方法

調用 Observable.create 創建序列,在構建函數裡描述元素的產生過程。

當一個序列completed或是出現error就不會再觸發後續的事件

Observable<String>.create { observer in
    observer.onNext("A")
    observer.onCompleted()
    observer.onNext("B")
    observer.onNext("C")
    return Disposables.create()
}.subscribe {
    print($0)
} onError: {
    print($0)
} onCompleted: {
    print("Completed")
} onDisposed: {
    print("Disposed")
}.disposed(by: disposeBag)
/// 印出結果
A
Completed
Disposed