標籤:轉寄 字元 xxx word 提醒 架構 code 關注 結果
RxSwift 或許我們都聽說過,但或許只知道 RxSwift 這個單詞,長篇大論關於 RxSwift 的介紹往往使讀者迷失在各種概念當中,卻不知如何讓它大展伸手。或許我們可以換一種姿勢,一些應用情境會讓我們產生共鳴,解決問題的方式由很多,為什麼不找一種最優的呢?RxSwift也許會幫到你。
什麼是 ReactiveX(Reactive Extensions)
- An API for asynchronous programming
with observable streams
通過可觀察的流實現非同步編程的一種API(不明白?嗯,看完所有的例子再讀一篇)
- ReactiveX is more than an API, it‘s an idea and a breakthrough in programming. It has inspired several other APIs, frameworks, and even programming languages.
ReactiveX 不僅僅是一種 API 那麼簡單,它更是一種編程思想的突破。它已經影響了其他 API,frameworks,以及程式設計語言。
它無處不在
它是跨平台的(RxJS,RxJava,RxNET),也就是說掌握 RxSwift 這種思想,學習其他的 Rx 系列的將非常簡單。
先來個總結?還沒開始就總結!
ReactiveX(Reactive Extensions)是通過可觀察的流實現非同步編程的一種API,它結合了觀察者模式、迭代器模式和函數式編程的精華。RxSwift 是 ReactiveX 編程思想的一種實現,幾乎每一種語言都會有那麼一個 Rx[xxxx] 架構,比如 RxJava,RxJS 等。Rx 可以概括為:
- 觀察者模式 Observable:對某些資料流(很廣,可以是一些事件等)進行處理,使其變成可觀察對象(Observable)序列,這樣觀察者(observer)就可以訂閱這些序列;
- 操作符 Operators:然而對於訂閱者來說(observer)某些選項(items)並不是自己需要的(需要過濾),某些選項(items)需要轉換才能達到自己的目的;
- 迭代模式 Iterator:這樣集合或者序列中的值就可以進行遍曆了。
- 調度器 Scheduler:為了提升使用者體驗,或其它目的,有些操作需要放到特定的線程去執行,比如 UI 操作需要放到主線程,這就涉及到了調度器。
所以 Rx 可以這樣概括,Rx = Observables + LINQ + Schedulers,其中 LINQ(Language Integrated Query)Language-integrated Query (LINQ),比如那些操作符號。
先來看個例子:修改使用者暱稱
使用者暱稱必須由3-10個字元組成,使用者名稱不合法時顯示提示(暱稱由3-10個字元組成),且修改按鈕不可點擊。
func registerRx() { let nickNameValid = nickNameTextField.rx.text.orEmpty .map { (text) -> Bool in let tLength = text.characters.count return tLength >= 3 && tLength <= 10 } .share(replay: 1) nickNameValid .bind(to: alertLabel.rx.isHidden) .disposed(by: disposeBag) nickNameValid .bind(to: changeButton.rx.isEnabled) .disposed(by: disposeBag) changeButton.rx.tap .subscribe { (next) in print("修改暱稱成功!") } .disposed(by: disposeBag)}
圖片發自簡書App知識點說明
- 安裝 RxSwift 時會安裝 RxSwift(對ReactiveX的實現) 和 RxCocoa(對iOS cocoa 層的實現);
- orEmpty:主要使
String?
類型變為 String
類型;
- map:它屬於 Rx 變換操作中的一種,主要對 Observable 發射的資料應用一個函數,執行某種操作,返回經過函數處理過的 Observable。Observable 可觀察的對象,用來被觀察者(observer)訂閱,這樣observe可以監聽Observable發出的事件;
- share(replay: 1):只允許監聽一次;
到這裡,還不瞭解基本概念?Observable
Observable 直譯為可觀察的,它在 RxSwift 起到了舉足輕重的作用,在整個 RxSwift 的使用過程中你會經常與它打交道。如果你使用過 RAC ,它如同 Signal
一樣。RxSwift 中關鍵點就是在於如何把普通的資料或者事件變成可觀察的,這樣當某些資料或事件有變化的時候就會通知它的訂閱者。
那如何能夠讓某些資料或事件成為 Observable 呢?
RxSwift 中提供很多種建立 Observable 建立方法。比如:From
、never
、empty
和 create
等,更多建立方法。訂閱者可以收到 3 個事件,onNext
、onError
和 onCompleted
,每個 Observable 都應該至少有一個 onError
或 onCompleted
事件,onNext
表示它傳給下一個接收者時的資料流。
func create() { let observable = Observable<String>.create { (observer) -> Disposable in observer.onNext("Hello Lefe_x, I am here!") observer.onCompleted() return Disposables.create() } observable.subscribe(onNext: { (text) in print(text) }, onError: nil, onCompleted: { print("complete!") }, onDisposed: nil).disposed(by: disposeBag) }
juli
Lefe_x 經常刷微博,剛開始時他並不刷微博,別人也不會看到他發的內容(這時他是不可訂閱的)。某天,Lefe_x 想讓自己學到的知識能協助更多的同學,他就註冊了微博,開始了刷微博之旅(變成了可訂閱的 Observable),這樣別人就可以關注他(訂閱)。慢慢地,越來越多的人開始關注他,這樣當他發微博(事件流)的時候,它的粉絲就可以被提醒(通知訂閱者),這些提醒有不同功能,比如有的是提醒 Lefe_x 發布了新微博,有的提醒微博被轉寄了(相當於 onNext
、onError
和 onCompleted
事件)。
Operators 操作符
Observable 建立後,可能為了滿足某些需求需要修改它,這時就需要用到操作符。RxSwift 提供了非常多的操作符,當然不必要一一掌握這些操作符,使用的時候查一下即可,當然常見的操作符必須要掌握,比如 map
、flatMap
、create
、filter
等。這裡查看更多
再來個例子放鬆下:
這個例子主要把尋找數組中的字串 Lefe_x
,並顯示到 Label 上。
override func viewDidLoad() { super.viewDidLoad() DispatchQueue.global().async { self.from() }} func from() { Observable.from(["Lefe", "Lefe_x", "lefex", "wsy", "Rx"]) .subscribeOn(MainScheduler.instance) .filter({ (text) -> Bool in return text == "Lefe_x" }) .map({ (text) -> String in return "我的新浪微博是: " + text }) .subscribe(onNext: { [weak self] (text) in self?.nickNameLabel.text = text }) .disposed(by: disposeBag)}
運行結果為:
圖片發自簡書App
呀,這不是前幾天有人寫過的嗎?沒錯,那是前幾天發的一個 #iOS知識小集# ,不過哪裡只是一個總結,沒有詳細的說明。這裡主要說一下調度器 (Scheduler)。
Scheduler 調度器
如果你想給 Observable 操作符鏈添加多線程功能,你可以指定操作符(或者特定的Observable)在特定的調度器(Scheduler)上執行。對於 ReactiveX 中可觀察對象操作符來說,它有時會攜帶一個調度器作為參數,這樣可以指定可觀察對象在哪一個線程中執行。而預設的情況下,某些可觀察對象是在訂閱者訂閱時的那個線程中執行。SubscribeOn 可以改變可觀察對象該在那個調度器中執行。ObserveOn 用來改變給訂閱者發送通知時所在的調度器。這樣就可以使可觀察對象想在那個調度器中執行就在那個調度器中執行,不受約束,而這些細節是不被調用者所關心的。猶如 GCD 一樣,你只管使用,底層線程是咋麼建立的,你不必關心。
寫在最後
下一篇打算寫一些關於 Rx 做資料繫結和網路層的互動。
參考
- Reactivex
- RxSwift 學習指導索引
- ReactiveX文檔中文翻譯
- realm
Lefe
連結:https://www.jianshu.com/p/35ed80a05952
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
給 iOS 開發人員的 RxSwift(一)