每一個 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