本文主要是介紹 Observable 不同的創(chuàng)建方式
基本名詞解析
Observable
- 可監(jiān)聽(tīng)序列
- 是事件的生產(chǎn)者
舉例:
溫度是一個(gè)序列
秧耗,然后檢測(cè)溫度诸尽,并對(duì)這個(gè)值做出響應(yīng)
- 當(dāng)溫度達(dá)到 33 度事阁最,打開(kāi)空調(diào)降溫
Observable 也分為 有限觀察序列
和 無(wú)限觀察序列
术浪,這里以 timer 為例
- 有限觀察序列:觀察之前就已經(jīng)明確觀察的次數(shù)虹菲,例如 just睡雇、of萌衬、from等
- 無(wú)限觀察序列:觀察次數(shù)不明確
這里以 timer 為例
- 有限的timer(不加period):只觀察一次
let ob = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
ob.subscribe { num **in**
print(num)
}onCompleted: {
print("done")
}.disposed(by: disposeBag)
//打印
done
- 無(wú)限的timer(加period):會(huì)一直觀察下去
let ob = Observable<Int>.timer(.seconds(1), period: .seconds(2), scheduler: MainScheduler.instance)
ob.subscribe { num **in**
print(num)
}onCompleted: {
print("done")
}.disposed(by: disposeBag)
//打印
done
done
...
done
Observer
- 觀察者
- 用來(lái)監(jiān)聽(tīng)事件,并對(duì)事件最初響應(yīng)
監(jiān)聽(tīng)當(dāng)前室內(nèi)溫度它抱,當(dāng)高于33度時(shí)秕豫,打開(kāi)空調(diào)降溫
打開(kāi)空調(diào)降溫就是觀察者
RxSwift 創(chuàng)建方式
Observable
序列的創(chuàng)建有以下一些方式
創(chuàng)建方式 | 說(shuō)明 |
---|---|
empty | 創(chuàng)建一個(gè)空的序列,但是只能訂閱到 complete |
just |
創(chuàng)建一個(gè)只有一個(gè)元素的 Observable 隊(duì)列,訂閱完信息自動(dòng) complete |
of |
創(chuàng)建一個(gè)固定數(shù)量元素的 Observable 序列 |
from |
從一個(gè)序列(如 Array/Dictionary/Set)中創(chuàng)建一個(gè) Observable 序列 |
deferred | 為每一個(gè)訂閱者創(chuàng)建一個(gè)新的 Observable 序列 |
generate | 創(chuàng)建一個(gè) Observable 序列混移,只需提供的條件值為 true 就可以生成值 |
error | 創(chuàng)建一個(gè)不會(huì)發(fā)送任何條目并且立即終止錯(cuò)誤的 Observable 序列 |
range | 創(chuàng)建一個(gè) Observable 序列祠墅,它會(huì)發(fā)出一系列的整數(shù),然后終止 |
timer | 獲取計(jì)時(shí)器 Observable 序列 |
interval | 底層就是 timer |
repeatElement | 創(chuàng)建一個(gè)可以無(wú)限發(fā)出給定元素Event 的 Observable 序列歌径,即永不終止
|
never | 創(chuàng)建一個(gè)永遠(yuǎn)不會(huì)發(fā)出Event(也不會(huì)終止)的 Observable 序列 |
empty 創(chuàng)建
- 創(chuàng)建一個(gè)空的序列
原本序列事件是Int類(lèi)型的毁嗦,但這里調(diào)用emty函數(shù) ,即沒(méi)有序列回铛,只能走 complete
let emtyOb = Observable<Int>.empty()
_ = emtyOb.subscribe(onNext: { num in
print(num)
}, onError: { error in
print(error)
}, onCompleted: {
print("完成")
}, onDisposed: {
print("釋放")
})
//-------打印--------
完成
釋放
just 創(chuàng)建
- 單個(gè)信號(hào)序列創(chuàng)建(例如:viewModel/VC建立依賴關(guān)系)
let array = ["Lily", "Tom"]
Observable<[String]>.just(array)
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(["Lily", "Tom"])
completed
of 創(chuàng)建
- 多個(gè)元素 狗准,即針對(duì)序列處理
Observable<String>.of("Lily", "Tom")
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(Lily)
next(Tom)
completed
- 數(shù)組
Observable<[String]>.of(["Lily", "Tom"])
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(["Lily", "Tom"])
completed
- 字典
Observable<[String: Any]>.of(["name1": "Tom", "name2": "Lily"])
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(["name2": "Lily", "name1": "Tom"])
completed
from 創(chuàng)建
- 從集合中獲取序列:數(shù)組,集合茵肃,set 獲取序列
有可選項(xiàng)處理 - 更安全
Observable<[String]>.from(optional: ["Lily", "Tom"])
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(["Lily", "Tom"])
completed
deferred 創(chuàng)建
- 使用
deferred()
方法延遲Observable序列的初始化
腔长,通過(guò)傳入的block
來(lái)實(shí)現(xiàn)Observable序列的初始化并且返回。 - 使用場(chǎng)景:登錄/注冊(cè)屬于同一個(gè)頁(yè)面時(shí)验残,動(dòng)態(tài)判斷不同邏輯
需求:動(dòng)態(tài)序列 - 根據(jù)外界的標(biāo)識(shí) - 動(dòng)態(tài)輸出
var isOdd = true
_ = Observable<Int>.deferred({ () -> Observable<Int> in
// 設(shè)計(jì)的序列
isOdd = !isOdd
if isOdd {
return Observable.of(1, 3, 5, 7, 9)
}
return Observable.of(0, 2, 4, 6, 8)
})
.subscribe({ event in
print(event)
})
//-------打印--------
next(0)
next(2)
next(4)
next(6)
next(8)
completed
generate 創(chuàng)建
- 該方法創(chuàng)建一個(gè)只有當(dāng)提供的
所有的判斷條件都為 true
的時(shí)候饼酿,才會(huì)給出動(dòng)作的 Observable 序列。 - 初始值給定 --> 然后判斷條件1 --> 再判斷條件2 --> 會(huì)一直遞歸下去胚膊,直到條件1或者條件2不滿足
- 類(lèi)似 數(shù)組遍歷循環(huán)
Observable.generate(initialState: 0, //初始值
condition: { $0 < 10}, //條件1
iterate: { $0 + 2 }) //條件2
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(0)
next(2)
next(4)
next(6)
next(8)
completed
- 數(shù)組遍歷
let arr = ["1", "2", "3", "4"]
Observable.generate(initialState: 0,// 初始值
condition: { $0 < arr.count}, // 條件1
iterate: { $0 + 1 }) // 條件2 +2
.subscribe(onNext: {
print("遍歷arr:", arr[$0])
}).disposed(by: disposeBag)
//-------打印--------
遍歷arr: 1
遍歷arr: 2
遍歷arr: 3
遍歷arr: 4
error 創(chuàng)建
- 對(duì)消費(fèi)者發(fā)出一個(gè)錯(cuò)誤信號(hào)
Observable<String>.error(NSError.init(domain: "lgerror", code: 10086, userInfo: ["reason": "unknow"]))
.subscribe { event in
print("訂閱:", event)
}
.disposed(by: disposeBag)
range 創(chuàng)建
- range:生成
指定范圍內(nèi)
的可觀察整數(shù)序列。
Observable.range(start: 2, count: 5)
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
//-------打印--------
next(2)
next(3)
next(4)
next(5)
next(6)
completed
timer創(chuàng)建
- 第一次參數(shù):第一次響應(yīng)距離現(xiàn)在的時(shí)間
- 第二個(gè)參數(shù):時(shí)間間隔
- 三個(gè)參數(shù):線程
- 如果沒(méi)有指定期限
period
想鹰,故認(rèn)定為一次性 - 使用場(chǎng)景:需要自定義定時(shí)器
Observable<Int>.timer(.seconds(5), period: .seconds(2), scheduler: MainScheduler.instance)
.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
// 因?yàn)闆](méi)有指定期限period紊婉,故認(rèn)定為一次性
Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
.subscribe { event in
print("111111111 \(event)")
}
interval 創(chuàng)建
- 封裝好的定時(shí)器
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.subscribe { event in
print(event)
}
repeatElement 創(chuàng)建
- 該方法創(chuàng)建一個(gè)可以
無(wú)限發(fā)出給定元素的 Event
的 Observable 序列(永不終止)
Observable<Int>.repeatElement(5)
.subscribe { event in
// print("訂閱:", event)
}
.disposed(by: disposeBag)
never 創(chuàng)建
- 該方法創(chuàng)建一個(gè)
永遠(yuǎn)不會(huì)發(fā)出 Event
(也不會(huì)終止)的 Observable 序列。 - 這種類(lèi)型的響應(yīng)源 在測(cè)試或者在組合操作符中禁用確切的源非常有用
Observable<String>.never()
.subscribe { event in
print("886", event)
}
.disposed(by: disposeBag)