RxSwift(1)— 初探

就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!ios


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 的數字,
  • 獲取到的數字以後 + 1,
  • 再輸出全部數字中的偶數
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簡介

RxSwiftReactiveX 家族的重要一員, ReactiveXReactive Extensions 的縮寫,通常簡寫爲 RxReactiveX 官方給Rx的定義是:Rx是一個使用可觀察數據流進行異步編程的編程接口。

ReactiveX 不只僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。它拓展了觀察者模式,使你可以自由組合多個異步事件,而不須要去關心線程同步,線程安全併發數據以及I/O阻塞

RxSwiftRxSwift 語言開發的一門函數響應式編程語言, 它能夠代替iOS系統的 Target Action / 代理 / 閉包 / 通知 / KVO,同時還提供網絡數據綁定UI事件處理UI的展現和更新多線程……

鑑於Swift日漸增加的影響力,ios開發者不可避免的要學習和使用Swift這門語言進行編程開發。而RxSwift對使用Swift的幫助有以下幾點:

Swift爲值類型,在傳值與方法回調上有影響,RxSwift必定程度上彌補Swift的靈活性

  • RxSwift使得代碼複用性較強,減小代碼量
  • RxSwift由於聲明都是不可變動,增長代碼可讀性
  • RxSwift使得更易於理解業務代碼,抽象異步編程,統一代碼風格
  • RxSwift使得代碼更易於編寫集成單元測試,增長代碼穩定性

一:button點擊事件

//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) 
}
複製代碼

二:textfiled文本響應

//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)
}
複製代碼

三:scrollView效果

//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)
}
複製代碼
  • 從上面三個UI效果來講,若是原生實現必將作不少噁心的處理:addTarget或者實現響應代理, 可是在RxSwift的世界裏只須要一句代碼:爽!

四:KVO

//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)
}
複製代碼
  • 原生KVO就須要三部曲,很是噁心,其實對於咱們開發來講根本不必!
  • 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

八:timer定時器

//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免去了咱們計時器的一些沒必要要的麻煩
  • runloop影響
  • 銷燬問題
  • 線程問題

RxSwift這個框架很是牛逼,把函數響應式玩到了高潮!不管從代碼量,仍是從代碼的可讀性,抑或代碼的複用性......都是大大優化!讓開發者拋棄更多的膠水代碼,直面開發需求。若是你還在爲你開發效率而煩惱,那麼RxSwift是你不二的選擇!若是還在糾結怎麼學習,那麼個人這個RxSwift專題就是你不二的選擇!若是你想更加系統學習進階iOS,那麼Cooci更是你不二的選擇!

就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!

相關文章
相關標籤/搜索