理解 RxSwift:爲何要使用 RxSwift(一)html
RxSwift 是一個能夠幫助咱們簡化異步編程的框架,它是 ReactiveX(簡寫:Rx) 的 Swift 版本。react
RxSwift 拓展了觀察者模式,它能幫你自由組合多個異步事件,而不須要去關心線程,同步,線程安全,併發數據以及I/O阻塞。git
RxSwift 屬於函數響應式編程。它是經過構建函數操做數據序列,而後對這些序列作出響應的編程方式。它結合了函數式編程以及響應式編程。github
函數式編程須要咱們將函數做爲參數傳遞,或者做爲返回值返回。咱們能夠經過組合不一樣的函數來獲得想要的結果。編程
看個例子:swift
// 全校學生
let allStudents: [Student] = getSchoolStudents()
// 三年二班的學生
let gradeThreeClassTwoStudents: [Student] = allStudents
.filter { student in student.grade == 3 && student.class == 2 }
// 由高到低打印三年二班的學生成績
gradeThreeClassTwoStudents
.sorted { student0, student1 in student0.score > student1.score }
.forEach { student in print("score: \(student.score), name: \(student.name)") }
複製代碼
響應式編程是使用異步數據流進行編程。任何事物均可以是一個數據流,如用戶輸入、點擊事件、定時器、網絡請求等,監聽數據流並相應的做出響應。安全
在這個基礎上,能夠用多種函數去組合、建立、過濾這些數據流,這就是函數響應式編程。bash
// 假設用戶在進入頁面到離開頁面期間,總共點擊按鈕 3 次
// 按鈕點擊序列
let taps: Observable<Void> = button.rx.tap.asObservable()
// 每次點擊後彈出提示框
taps.subscribe(onNext: { showAlert() })
複製代碼
可觀察對象,用來發射數據,next事件表示發射新的數據,complete事件表示發射完成,error表示出現異常網絡
例子,從0開始依次發射10個數字
let numbers: Observable<Int> = Observable.create { observer -> Disposable in
observer.onNext(0)
observer.onNext(1)
observer.onNext(2)
observer.onNext(3)
observer.onNext(4)
observer.onNext(5)
observer.onNext(6)
observer.onNext(7)
observer.onNext(8)
observer.onNext(9)
observer.onCompleted()
return Disposables.create()
}
複製代碼
觀察者對象,用來監聽事件並作出響應。
例子,上面的Observable發送了10個數字,在這裏建立一個Observer,監聽並打印收到的數據
numbers.subscribe(onNext: { number in
print(number)
}, onError: { error in
print("發生錯誤: \(error.localizedDescription)")
}, onCompleted: {
print("任務完成")
})
複製代碼
操做符,用於建立新的Observable對象或變換組合原有的Observable。
例子,filter操做符是根據條件過濾一個 Observable,下面的代碼是過濾大於10的數
let disposeBag = DisposeBag()
Observable.of(2, 30, 22, 5, 60, 1)
.filter { $0 > 10 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
//output
30
22
60
複製代碼
官方 Demo beeth0ven.github.io/RxSwift-Chi…
以 Target Action 爲,對比下傳統實現和 RxSwift 的實現:
// 傳統實現方法
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
func buttonTapped() {
print("button Tapped")
}
複製代碼
// RxSwift
button.rx.tap
.subscribe(onNext: {
print("button Tapped")
})
.disposed(by: disposeBag)
複製代碼
RwSwift 的方式讓回調處理變得十分簡單。
一樣的,RxSwift 能夠替代一些異步回調,如代理、通知、KVO、併發事件等。更多例子參見官方文檔:beeth0ven.github.io/RxSwift-Chi…
在 MVVM 架構中,利用數據綁定,讓數據與視圖進行分離,當數據有更新,自動去更新視圖,視圖改變的同時又自動反饋到數據,數據是主導因素,這樣可讓重心集中在數據邏輯處理上。
因爲 iOS 沒有提供很好的數據與視圖綁定,咱們須要藉助第三方庫實現這一功能,RxSwift 就是一個很好的選擇。
RxSwift 提供了一種優雅的方式,讓 View 和 ViewModel 之間的同步變得簡單,避免了編寫大量繁瑣的命令式綁定代碼。
注:RxSwift 不是必定要配合 MVVM 使用,在 MVC 中,一樣能夠利用數據視圖綁定,快速完成 UI 開發。
RxSwift 帶來了聲明式編程範式,只須要告訴系統須要計算「什麼」而不是「如何」去計算。聲明式編程讓開發者將注意力從繁瑣的 View 操做中解脫出來,專一於業務邏輯的實現。
在聲明式編程中,一個流程是從數據源開始的,經過數據變換,對數據作一些加工、轉換,最終在視圖上展現出來。通常數據源是經過調接口拿到原始數據,原始數據不能直接使用,每每須要根據業務進行加工處理變換,生成新格式的數據,最後綁定到視圖上,當數據更新時,視圖同步更新。在這個流程中,RxSwift 利用衆多的操做符,完成各類類型的數據變換,以及數據和視圖的綁定。
咱們知道 MVC 的單元測試很難寫,其中的一個緣由是函數可能會直接操做視圖,致使測試和驗證難以進行。
RxSwift 綁定數據與視圖進行同步,承擔了視圖操做,數據的更新後自動同步視圖,開發者只須要編寫數據處理邏輯,從而讓咱們得以對數據進行測試。
函數響應式編程愈來愈受到開發者的歡迎,緣由就在於,它能複雜的異步代碼更容易地編寫與理解,以及爲 MVVM 提供數據同步功能。特別是 RxSwift 帶來的數據同步,讓 View 和 ViewModel 之間的同步變得簡單,很好地補充了 MVVM,在前端 React 技術棧中,RxJs 並非一個經常使用的庫,由於 React 不須要第三方庫提供數據綁定功能,因此 RxJs 僅有的優點是簡化異步事件。
固然 RxSwift 也存在一些缺點,包括學習成本高、侵入性強、適合複雜的異步數據流場景,不適合簡單業務等。RxSwift 帶來新的概念和思想,如函數式、響應式編程,聲明式編程,跟傳統的編程方式差別較大,須要花不少時間熟悉新的開發模式。而且在 APP 開發中,不少場景流程較簡單,交互也很少,用通知、 block 等已經足夠解決問題。
在這篇文章中,咱們介紹了 RxSwift 的一些基本概念和使用方法,並給出了四個理由解釋爲何要使用 RxSwift。
但願這篇文章能幫你瞭解 RxSwift,趕快用起來吧。
本系列的下一篇將會分析 RxSwift 的實現原理,並一塊兒寫一個簡單版的 RxSwift,幫你真正理解它的內部運行過程和實現原理。