1. 程式人生 > >給 iOS 開發者的 RxSwift(一)

給 iOS 開發者的 RxSwift(一)

ner 調度 obs 觀察者 ble 事件 let original super

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)語言集成查詢,比如那些操作符號。

先來看個例子:修改用戶昵稱

用戶昵稱必須由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 創建方法。比如:Fromneveremptycreate等,更多創建方法。訂閱者可以收到 3 個事件,onNextonErroronCompleted,每個 Observable 都應該至少有一個 onErroronCompleted事件,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 發布了新微博,有的提醒微博被轉發了(相當於 onNextonErroronCompleted事件)。

Operators 操作符

Observable 創建後,可能為了滿足某些需求需要修改它,這時就需要用到操作符。RxSwift 提供了非常多的操作符,當然不必要一一掌握這些操作符,使用的時候查一下即可,當然常見的操作符必須要掌握,比如 mapflatMapcreatefilter等。這裏查看更多

再來個例子放松下:

這個例子主要把查找數組中的字符串 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(一)