就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!ios
- RxSwift(1)— 初探
- RxSwift(2)— 核心邏輯源碼分析
- RxSwift(3)— Observable序列的建立方式
- RxSwift(4)— 高階函數(上)
- RxSwift(5)— 高階函數(下)
- RxSwift(6)— 調度者-scheduler源碼解析(上)
- RxSwift(7)— 調度者-scheduler源碼解析(下)
- RxSwift(8)— KVO底層探索(上)
- RxSwift(9)— KVO底層探索(下)
- RxSwift(10)— 場景序列總結
- RxSwift(11)— dispose源碼解析
- RxSwift(12)— Subject即攻也守
- RxSwift(13)— 爬過的坑
- RxSwift(14)— MVVM雙向綁定
RxSwift 目錄直通車 --- 和諧學習,不急不躁!編程
這個篇章初探
RxSwift
--函數響應式框架,迎合Swift
語法特性,是很是爽的一件事!當北京趕上西雅圖,當Swift
趕上RxSwift
。個人天啊!簡直爽的不要不要的json
函數式編程簡稱FP(Functional Programming)
,函數式編程就是一種抽象程度很高的編程範式,它將計算機運算看作是數學中函數的計算,而純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。而容許使用變量的程序設計語言,因爲函數內部的變量狀態不肯定,一樣的輸入,可能獲得不一樣的輸出,所以,這種函數是有反作用的。swift
函數式編程的一個特色就是:容許把函數自己做爲參數傳入另外一個函數,同時還容許返回一個函數!數組
函數表達式: y = f(x) ---> x = f(x) ---> y = f(f(x))安全
常規需求例子,感覺函數式的舒服!網絡
[1,2,3,4,5,6,7,8,9,10]
,首先獲取 > 2
的數字,let array = [1,2,3,4,5,6,7,8,9,10]
for num in array{
if num > 2{
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
複製代碼
let array = [1,2,3,4,5,6,7,8,9,10]
array.filter{ $0 > 2}
.filter{ ($0+1) % 2 == 1}
.forEach { print($0) }
複製代碼
對象對某一數據流變化作出響應的這種編碼方式稱爲響應式。 例如咱們在愛奇藝平臺觀看視頻,咱們只須要在某一個時刻訂閱了這個視頻,後面平臺自媒體運營者不斷更新視頻,咱們隨着時間也能自定接受推送,這就是響應多線程
在iOS開發中咱們常常會響應一些事件button、tap、textField、textView、notifaction、KVO、NSTimer
等等這些,都須要作響應監聽,響應後都須要在對應的響應事件中去作處理,而原生開發中,觸發對象與響應方法是分離的,如button
的初始化和點擊響應方法是分離的。功能代碼與邏輯代碼分析,致使不少比較噁心的感受!閉包
blingbling, blingbling, blingbling!
RxSwift 閃亮登場併發
RxSwift
是 ReactiveX
家族的重要一員, ReactiveX
是 Reactive Extensions
的縮寫,通常簡寫爲 Rx
。ReactiveX
官方給Rx
的定義是:Rx是一個使用可觀察數據流進行異步編程的編程接口。
ReactiveX
不只僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。它拓展了觀察者模式
,使你可以自由組合多個異步事件
,而不須要去關心線程
,同步,線程安全
,併發數據以及I/O阻塞
。
RxSwift
是 Rx
爲 Swift
語言開發的一門函數響應式編程語言, 它能夠代替iOS系統的 Target Action
/ 代理
/ 閉包
/ 通知
/ KVO
,同時還提供網絡
、數據綁定
、UI事件處理
、UI的展現和更新
、多線程
……
鑑於Swift
日漸增加的影響力,ios開發者不可避免的要學習和使用Swift
這門語言進行編程開發。而RxSwift
對使用Swift
的幫助有以下幾點:
Swift
爲值類型,在傳值與方法回調上有影響,RxSwift
必定程度上彌補Swift
的靈活性
RxSwift
使得代碼複用性較強,減小代碼量RxSwift
由於聲明都是不可變動,增長代碼可讀性RxSwift
使得更易於理解業務代碼,抽象異步編程,統一代碼風格RxSwift
使得代碼更易於編寫集成單元測試,增長代碼穩定性//MARK: - RxSwift應用-button響應
func setupButton() {
// 傳統UI事件
self.button.addTarget(self, action: #selector(didClickButton), for: .touchUpInside)
// 這樣的操做 - 不行啊!代碼邏輯與事件邏輯分層
self.button.rx.tap
.subscribe(onNext: { [weak self] in
print("點了,小雞燉蘑菇")
self?.view.backgroundColor = UIColor.orange
})
.disposed(by: disposeBag)
}
複製代碼
//MARK: - RxSwift應用-textfiled
func setupTextFiled() {
// 咱們若是要對輸入的文本進行操做 - 好比輸入的的內容 而後咱們獲取裏面的偶數
// self.textFiled.delegate = self
// 感受是否是特別噁心
// 下面咱們來看看Rx
self.textFiled.rx.text.orEmpty.changed.subscribe(onNext: { (text) in
print("監聽到了 - \(text)")
}).disposed(by: disposeBag)
self.textFiled.rx.text.bind(to: self.button.rx.title()).disposed(by: disposeBag)
}
複製代碼
//MARK: - RxSwift應用-scrollView
func setupScrollerView() {
scrollView.rx.contentOffset.subscribe(onNext: { [weak self] (content) in
self?.view.backgroundColor = UIColor.init(red: content.y/255.0*0.8, green: content.y/255.0*0.3, blue: content.y/255.0*0.6, alpha: 1);
print(content.y)
}).disposed(by: disposeBag)
}
複製代碼
addTarget
或者實現響應代理
, 可是在RxSwift
的世界裏只須要一句代碼:爽!//MARK: - RxSwift應用-KVO
func setupKVO() {
// 系統KVO 仍是比較麻煩的
// person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
person.rx.observeWeakly(String.self, "name").subscribe(onNext: { (change) in
print(change ?? "helloword")
}).disposed(by: disposeBag)
}
複製代碼
RxSwift
仍是溫柔的一句代碼搞定//MARK: - 通知
func setupNotification(){
NotificationCenter.default.rx
.notification(UIResponder.keyboardWillShowNotification)
.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
}
複製代碼
RxSwift
風格里面保留//MARK: - 手勢
func setupGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe { (event) in
print("點了label")
}.disposed(by: disposeBag)
}
複製代碼
RxSwift
是實現的響應關係,自己手勢也是須要添加事件對象的!RxSwift
會把開發者變傻,哈哈哈......//MARK: - RxSwift應用-網絡請求
func setupNextwork() {
let url = URL(string: "https://www.baidu.com")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response, data) in
print("response ==== \(response)")
print("data ===== \(data)")
}, onError: { (error) in
print("error ===== \(error)")
}).disposed(by: disposeBag)
}
複製代碼
URLSession
也是封裝處理。提供了response
,data
,json
不一樣的便於開發者選擇的合適函數,說白就是方便RxSwift
在網絡這一層也是有不少響應式處理:好比典型的RxMoya
//MARK: - RxSwift應用-timer定時器
func setupTimer() {
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print("hello word \(num)")
}).disposed(by: disposeBag)
}
複製代碼
RxSwift
實現的timer
免去了咱們計時器的一些沒必要要的麻煩RxSwift這個框架很是牛逼,把函數響應式玩到了高潮!不管從代碼量,仍是從代碼的可讀性,抑或代碼的複用性......都是大大優化!讓開發者拋棄更多的膠水代碼,直面開發需求。若是你還在爲你開發效率而煩惱,那麼
RxSwift
是你不二的選擇!若是還在糾結怎麼學習,那麼個人這個RxSwift
專題就是你不二的選擇!若是你想更加系統學習進階iOS,那麼Cooci更是你不二的選擇!就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!