RxSwift(1)—— 初探

就問此時此刻還有誰汹胃?45度仰望天空喷楣,該死夜赵!我這無處安放的魅力乎完!


RxSwift目錄直通車--- 和諧學(xué)習(xí)瞒瘸,不急不躁伟桅!


這個篇章初探RxSwift--函數(shù)響應(yīng)式框架雕蔽,迎合Swift語法特性刊侯,是非常爽的一件事声离!當(dāng)北京遇上西雅圖芒炼,當(dāng)Swift遇上RxSwift。我的天笆趸病本刽!簡直爽的不要不要的

函數(shù)響應(yīng)式編程

一:函數(shù)式

函數(shù)式編程簡稱FP(Functional Programming),函數(shù)式編程就是一種抽象程度很高的編程范式赠涮,它將計算機(jī)運算看做是數(shù)學(xué)中函數(shù)的計算子寓,而純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此笋除,任意一個函數(shù)斜友,只要輸入是確定的,輸出就是確定的垃它,這種純函數(shù)我們稱之為沒有副作用鲜屏。而允許使用變量的程序設(shè)計語言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定国拇,同樣的輸入洛史,可能得到不同的輸出,因此酱吝,這種函數(shù)是有副作用的虹菲。

函數(shù)式編程的一個特點就是:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),同時還允許返回一個函數(shù)掉瞳!

函數(shù)表達(dá)式: y = f(x) ---> x = f(x) ---> y = f(f(x))

常規(guī)需求例子毕源,感受函數(shù)式的舒服浪漠!

  • 對于數(shù)組 [1,2,3,4,5,6,7,8,9,10],首先獲取 > 2 的數(shù)字霎褐,
  • 獲取到的數(shù)字之后 + 1址愿,
  • 再輸出所有數(shù)字中的偶數(shù)
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)
                  }
            }
        }
  • 上面的代碼嵌套層次之深,我覺得已經(jīng)非常惡心
  • 代碼的可讀性也是非常差的
  • 代碼復(fù)用性較低
  • 維護(hù)以及代碼構(gòu)建成本太高冻璃,這樣就成了函數(shù)式出現(xiàn)的必要性
let array = [1,2,3,4,5,6,7,8,9,10]
array.filter{ $0 > 2}
            .filter{ ($0+1) % 2 == 1}
            .forEach { print($0) }
  • 代碼層次非常清晰
  • 代碼可讀性高
  • 代碼復(fù)用性高
  • 代碼簡潔响谓,直接面向開發(fā)需求

二:響應(yīng)式

對象對某一數(shù)據(jù)流變化做出響應(yīng)的這種編碼方式稱為響應(yīng)式。
例如我們在愛奇藝平臺觀看視頻省艳,我們只需要在某一個時刻訂閱了這個視頻娘纷,后面平臺自媒體運營者不斷更新視頻,我們隨著時間也能自定接受推送跋炕,這就是響應(yīng)

在iOS開發(fā)中我們經(jīng)常會響應(yīng)一些事件button赖晶、tap、textField辐烂、textView遏插、notifaction、KVO纠修、NSTimer等等這些胳嘲,都需要做響應(yīng)監(jiān)聽,響應(yīng)后都需要在對應(yīng)的響應(yīng)事件中去做處理扣草,而原生開發(fā)中了牛,觸發(fā)對象與響應(yīng)方法是分離的,如button的初始化和點擊響應(yīng)方法是分離的辰妙。功能代碼與邏輯代碼分析白魂,導(dǎo)致很多比較惡心的感覺!

blingbling, blingbling, blingbling! RxSwift 閃亮登場

RxSwift簡介

RxSwiftReactiveX 家族的重要一員, ReactiveXReactive Extensions 的縮寫上岗,一般簡寫為 RxReactiveX 官方給Rx的定義是:Rx是一個使用可觀察數(shù)據(jù)流進(jìn)行異步編程的編程接口蕴坪。

ReactiveX 不僅僅是一個編程接口肴掷,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言背传。它拓展了觀察者模式呆瞻,使你能夠自由組合多個異步事件,而不需要去關(guān)心線程径玖,同步痴脾,線程安全并發(fā)數(shù)據(jù)以及I/O阻塞梳星。

RxSwiftRxSwift 語言開發(fā)的一門函數(shù)響應(yīng)式編程語言赞赖, 它可以代替iOS系統(tǒng)的 Target Action / 代理 / 閉包 / 通知 / KVO,同時還提供網(wǎng)絡(luò)滚朵、數(shù)據(jù)綁定UI事件處理前域、UI的展示和更新辕近、多線程……

鑒于Swift日漸增長的影響力,ios開發(fā)者不可避免的要學(xué)習(xí)和使用Swift這門語言進(jìn)行編程開發(fā)匿垄。而RxSwift對使用Swift的幫助有如下幾點:

Swift為值類型移宅,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補(bǔ)Swift的靈活性

  • RxSwift使得代碼復(fù)用性較強(qiáng)椿疗,減少代碼量
  • RxSwift因為聲明都是不可變更漏峰,增加代碼可讀性
  • RxSwift使得更易于理解業(yè)務(wù)代碼,抽象異步編程届榄,統(tǒng)一代碼風(fēng)格
  • RxSwift使得代碼更易于編寫集成單元測試浅乔,增加代碼穩(wěn)定性

一:button點擊事件

//MARK: - RxSwift應(yīng)用-button響應(yīng)
func setupButton() {
    // 傳統(tǒng)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文本響應(yīng)

//MARK: - RxSwift應(yīng)用-textfiled
func setupTextFiled() {
    // 我們?nèi)绻獙斎氲奈谋具M(jìn)行操作 - 比如輸入的的內(nèi)容 然后我們獲取里面的偶數(shù)
    // self.textFiled.delegate = self
    // 感覺是不是特別惡心
    // 下面我們來看看Rx
    self.textFiled.rx.text.orEmpty.changed.subscribe(onNext: { (text) in
        print("監(jiān)聽到了 - \(text)")
    }).disposed(by: disposeBag)
    
    self.textFiled.rx.text.bind(to: self.button.rx.title()).disposed(by: disposeBag)
}

三:scrollView效果

//MARK: - RxSwift應(yīng)用-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效果來說,如果原生實現(xiàn)必將做很多惡心的處理:addTarget或者實現(xiàn)響應(yīng)代理, 但是在RxSwift的世界里只需要一句代碼:爽痒蓬!

四:KVO

 //MARK: - RxSwift應(yīng)用-KVO
func setupKVO() {
    // 系統(tǒng)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就需要三部曲童擎,非常惡心,其實對于我們開發(fā)來說根本沒必要攻晒!
  • RxSwift還是溫柔的一句代碼搞定

五:通知

//MARK: - 通知
func setupNotification(){
    NotificationCenter.default.rx
        .notification(UIResponder.keyboardWillShowNotification)
        .subscribe { (event) in
            print(event)
    }.disposed(by: disposeBag)
}
  • 通知的實現(xiàn)顾复,也是比較友善的:編程習(xí)慣都有在RxSwift風(fēng)格里面保留
  • 這樣能夠最大的降低開發(fā)者的門檻,也是一個優(yōu)秀框架的必備條件

六:手勢

//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是實現(xiàn)的響應(yīng)關(guān)系,本身手勢也是需要添加事件對象的给梅!
  • 當(dāng)然這里我個人建議:可以更多拓展一層假丧!降低代碼量
  • 感覺RxSwift會把開發(fā)者變傻,哈哈哈......

七:網(wǎng)絡(luò)請求

//MARK: - RxSwift應(yīng)用-網(wǎng)絡(luò)請求
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不同的便于開發(fā)者選擇的合適函數(shù)包帚,說白就是方便
  • 但是針對網(wǎng)絡(luò)這一層,我們一般開發(fā)肯定是要處理运吓,不可能這么簡單(畢竟不符合開發(fā)需求)
  • 其實RxSwift在網(wǎng)絡(luò)這一層也是有很多響應(yīng)式處理:比如典型的RxMoya

八:timer定時器

//MARK: - RxSwift應(yīng)用-timer定時器
func setupTimer() {
    timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer.subscribe(onNext: { (num) in
        print("hello word \(num)")
    }).disposed(by: disposeBag)
}
  • RxSwift實現(xiàn)的timer免去了我們計時器的一些不必要的麻煩
  • runloop影響
  • 銷毀問題
  • 線程問題

RxSwift這個框架非常牛逼渴邦,把函數(shù)響應(yīng)式玩到了高潮!無論從代碼量拘哨,還是從代碼的可讀性谋梭,抑或代碼的復(fù)用性......都是大大優(yōu)化!讓開發(fā)者拋棄更多的膠水代碼倦青,直面開發(fā)需求瓮床。如果你還在為你開發(fā)效率而煩惱,那么RxSwift是你不二的選擇!如果還在糾結(jié)怎么學(xué)習(xí)隘庄,那么我的這個RxSwift專題就是你不二的選擇踢步!如果你想更加系統(tǒng)學(xué)習(xí)進(jìn)階iOS,那么Cooci更是你不二的選擇峭沦!

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菇肃,隨后出現(xiàn)的幾起案子地粪,更是在濱河造成了極大的恐慌,老刑警劉巖琐谤,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟆技,死亡現(xiàn)場離奇詭異,居然都是意外死亡斗忌,警方通過查閱死者的電腦和手機(jī)质礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织阳,“玉大人眶蕉,你說我怎么就攤上這事∵蠖悖” “怎么了造挽?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弄痹。 經(jīng)常有香客問我饭入,道長,這世上最難降的妖魔是什么肛真? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任谐丢,我火速辦了婚禮,結(jié)果婚禮上蚓让,老公的妹妹穿的比我還像新娘乾忱。我一直安慰自己,他們只是感情好凭疮,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著串述,像睡著了一般执解。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天衰腌,我揣著相機(jī)與錄音新蟆,去河邊找鬼。 笑死右蕊,一個胖子當(dāng)著我的面吹牛琼稻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饶囚,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帕翻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萝风?” 一聲冷哼從身側(cè)響起嘀掸,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎规惰,沒想到半個月后睬塌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡歇万,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年揩晴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贪磺。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡硫兰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缘挽,到底是詐尸還是另有隱情瞄崇,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布壕曼,位于F島的核電站苏研,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腮郊。R本人自食惡果不足惜摹蘑,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轧飞。 院中可真熱鬧衅鹿,春花似錦、人聲如沸过咬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸绞。三九已至泵三,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烫幕。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工俺抽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人较曼。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓磷斧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捷犹。 傳聞我的和親對象是個殘疾皇子弛饭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容