嗨,今天繼續我們繼續講Observable。
昨天在建立Observable時,有介紹到.of
跟.interval
,其實建立一個Observable有很多方式,今天介紹幾個我常用的,沒介紹到的就再請自己到ReactiveX - Operators看囉,我們開始吧!
單一物件的Observable(像是String, [String]或是自訂的Student都可以),當要把一個pure value轉成Observable時就可以用,像是bool
let observable = Observable.just(true)
// — - true — - | ->
.from
有兩個功能,
.from(array: [_])
,可以把陣列轉成Observable,注意一點,結果是把陣列逐一發送每個元素let observable = Observable.from([1, 3, 7])
// - - 1 - - 3 - - 7 — - | ->
.from(optional: _?)
,如果optional types變數不為nil,就發送let number: Int? = 5
let observable = Observable.from(optional: number)
// - - 5 - - | -> number為5的情況
// - - | -> number為nil的情況
不會發送也不會結束的Observable,在一些情境可能會用到,像我自己公司是用MVVMC架構,在root coordinator的func start(),因為不會結束,所以return了一個.never()
,其他情境,等我道行在高一點,再來分享。
let observable: Observable<Int> = .never()
只會發送.completed
的Observable,在測試的時候會用到,或是一些情境你想快點結束Observable,可以用到。
let observable: Observable<Int> = .empty()
只會發送.error
的Observable,在測試的時候比較常用到。
let error = NSError.init(domain: "測試", code: -1, userInfo: nil)
let observable: Observable<Int> = .error(error)
.create
提供你客製化Observable方式,我通常會寫成function,在需要自訂成功、失敗條件時很好用,舉個例子,.isEven(number: Int)
給定一個數字,判別是不是偶數,若是,就把該數字以Observable形式發送回來;若不是,就發送.error
。
func isEven(number: Int) -> Observable<Int> {
// 1
return Observable.create { observer in
if number % 2 == 0 {
// 2
observer.onNext(number)
observer.onCompleted()
} else {
// 3
observer.onError(NSError.init(domain: "不是偶數", code: 401, userInfo: nil))
}
// 4
return Disposables.create()
}
}
.create
參數中會有一個subscribe closure,這closure有一參數為observer,並且要使用它來表達對訂閱者發送行為.onNext
和.onCompleted
來發送成功的行為.onError
來發送失敗的行為今天補充介紹了如何建立Observable,明天要介紹Subject,明天再說,掰