RxSwift 系列(一)
為什么使用RxSwift?
我們編寫的代碼絕大多數(shù)都涉及對(duì)外部事件的響應(yīng)。當(dāng)用戶點(diǎn)擊操作時(shí),我們需要編寫一個(gè)@IBAction事件來響應(yīng)。我們需要觀察通知,以檢測(cè)鍵盤何時(shí)改變位置。當(dāng)網(wǎng)絡(luò)請(qǐng)求響應(yīng)數(shù)據(jù)時(shí),我們必須提供閉包來執(zhí)行。我們使用KVO來檢測(cè)變量的變化。所有這些不同的系統(tǒng)使我們的代碼增加了不必要地復(fù)雜。如果有一個(gè)一致的系統(tǒng)來處理我們的所有的調(diào)用/響應(yīng)代碼,難道不是更好嗎?Rx就是這樣一個(gè)系統(tǒng)。
RxSwift是用于大多數(shù)主要語言和平臺(tái)的響應(yīng)擴(kuò)展(即Rx)的正式實(shí)現(xiàn)。
概念
每一個(gè)Observable的實(shí)例都是一個(gè)序列
Observable序列相比于Swift序列的關(guān)鍵優(yōu)勢(shì)點(diǎn)在于它能夠異步地接收元素。這是RxSwift精髓所在,其他的一切都擴(kuò)展了這個(gè)概念。
- Observable(ObservableType)等效于Sequence
- observableType.subscribe(_:)方法等效于Sequence.makeIterator()
- ObservableType.subscribe(_:)接收一個(gè)觀察者ObserverType參數(shù),它將被訂閱自動(dòng)接收由可觀察到的序列事件和元素,而不是在返回的生成器上手動(dòng)調(diào)用next()
如果一個(gè)Observable發(fā)出一個(gè)next事件(Event.next(Element)),它還能夠繼續(xù)發(fā)出更多的事件。但是,如果一個(gè)Observable發(fā)出一個(gè)error事件(Event.error(ErrorType))或者一個(gè)completed事件(Event.completed),那么這個(gè)Observable序列就不能給訂閱者發(fā)送其他的事件了。
Observables and Observers(又名subscribers -- 訂閱者)
除非有訂閱者,否則Observable不會(huì)執(zhí)行它們的閉包。
在下面的例子中,Observable的閉包將不會(huì)被執(zhí)行,因?yàn)闆]有訂閱者訂閱。
在下面的例子中,Observable的閉包將會(huì)被執(zhí)行,因?yàn)橛杏嗛喺哂嗛啞?/p> _ = Observable<String>.create({ (observingString) -> Disposable inprint("the code will be executed")observingString.onNext("?")observingString.onCompleted()return Disposables.create()}).subscribe({ (event) inprint(event)})
我們現(xiàn)在不必?fù)?dān)心上面例子中的Observable是怎樣被創(chuàng)建出來,我會(huì)和大家一步一步深入學(xué)習(xí)。
subscribe(_:)返回一個(gè)一次性的實(shí)例,該實(shí)例表示一個(gè)可使用的資源,如訂閱。在前面的簡單示例中,它被忽略了,但是應(yīng)該正常地處理它。這通常意味著將它添加到一個(gè)DisposeBag實(shí)例中。
Creating and Subscribing to Observables
有幾種方式創(chuàng)建和訂閱Observables:
-
never
let disposeBag = DisposeBag() Observable<String>.never().subscribe({ (_) inprint("this will never be printed") }).disposed(by: disposeBag)
創(chuàng)建一個(gè)永不終止且不發(fā)出任何事件的序列。更多詳情 -
empty
let disposeBag = DisposeBag() Observable<Int>.empty().subscribe({ (event) inprint(event) }).disposed(by: disposeBag)
創(chuàng)建一個(gè)只發(fā)送completed事件的空Observable序列。更多詳情 -
just
let disposeBag = DisposeBag() Observable.just("單一元素").subscribe({ (event) inprint(event) }).disposed(by: disposeBag)
創(chuàng)建一個(gè)只有一個(gè)元素的Observable序列。更多詳情 -
of
let disposeBag = DisposeBag() Observable.of("元素1","元素2","元素3","元素4","元素5").subscribe(onNext: { (element) inprint(element) }).disposed(by: disposeBag)
創(chuàng)建一個(gè)固定數(shù)量元素的Observable序列。注意:此處用到了subscribe(onNext:)的便利構(gòu)造方法,有部分參數(shù)使用的是默認(rèn)值。
-
from
let disposeBag = DisposeBag() Observable.from(["元素1","元素2","元素3","元素4","元素5"]).subscribe(onNext: {print($0) }).disposed(by: disposeBag)
從一個(gè)序列(如Array/Dictionary/Set)中創(chuàng)建一個(gè)Observable序列。注意:這個(gè)例子使用了默認(rèn)參數(shù)$0而不是顯式地命名參數(shù)。
-
create
let disposeBag = DisposeBag() let myjust = { (element: String) -> Observable<String> inreturn Observable.create{ observer inobserver.on(.next(element))observer.on(.completed)return Disposables.create()} }myjust("籃球").subscribe({ (element) inprint(element) }).disposed(by: disposeBag)
創(chuàng)建一個(gè)自定義的Observable序列。更多詳情 -
range
let disposeBag = DisposeBag() Observable.range(start: 1, count: 10).subscribe { print($0) }.disposed(by: disposeBag)
創(chuàng)建一個(gè)Observable序列,它會(huì)發(fā)出一系列連續(xù)的整數(shù),然后終止。更多詳情 -
repeatElement
let disposeBag = DisposeBag() Observable.repeatElement("?").take(3).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
創(chuàng)建一個(gè)Observable序列,它可以無限地釋放給定元素。更多詳情上述例子中take操作符從一個(gè)序列開始返回指定數(shù)量的元素。
-
generate
let disposeBag = DisposeBag() Observable.generate(initialState: 0, condition: {$0 < 3}, iterate: {$0 + 1}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
創(chuàng)建一個(gè)Observable序列,只要提供的條件值為true就可以生成值。 -
deferred
let disposeBag = DisposeBag() var count = 1 let defferedSequen = Observable<String>.deferred {print("count = \(count)")count += 1return Observable.create({ (observer) -> Disposable inobserver.onNext("山羊")observer.onNext("野豬")observer.onNext("小貓")return Disposables.create()}) }defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag) defferedSequen.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
為每一個(gè)訂閱者創(chuàng)建一個(gè)新的Observable序列。更多詳情 -
error
let disposeBag = DisposeBag() Observable<Int>.error(TestError.test).subscribe { print($0) }.disposed(by: disposeBag)
創(chuàng)建一個(gè)不會(huì)發(fā)送任何條目并且立即終止錯(cuò)誤的Observable序列。 -
do
let disposeBag = DisposeBag() Observable.of(["元素1","元素2","元素3"]).do(onNext: {print("next:\($0)")}, onError: {print("error:\($0)")}, onCompleted: { print("completed") }).subscribe(onNext: {print($0)}).disposed(by: disposeBag)
為每個(gè)發(fā)出的事件調(diào)用一個(gè)副作用操作,并返回(通過)原始事件。更多詳情
致謝
若發(fā)現(xiàn)有錯(cuò)誤的地方,歡迎各位評(píng)論,感謝!同時(shí)也希望能夠幫助到有需要的同學(xué)。
轉(zhuǎn)載于:https://www.cnblogs.com/yujihaia/p/7425849.html
總結(jié)
以上是生活随笔為你收集整理的RxSwift 系列(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国移动手机营业厅(《中国》第一季)
- 下一篇: How to make a differ