深入淺出RxSwift

寫在前面

??最近使用RxSwift做項目也有段時間了。

??現(xiàn)在使用RxSwift做開發(fā)的給我個人的感覺就像開了個掛一樣竭缝。23333

??但是不得不承認(rèn), 剛開始接觸RxSwift的時候給我的感覺就是"這破玩意有什么用"

??我寫了四個比較有意思的場景,拋磚引玉,也許可以給一些正要學(xué)習(xí)使用RxSwift的人一些啟發(fā)诽偷。

??在正式提出場景之前先簡單介紹一下相關(guān)概念以及我的理解锋边。

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

??一句話:函數(shù)響應(yīng)式編程就是處理異步數(shù)據(jù)交互的一種編程范式。

??核心概念: 數(shù)據(jù)流、拆分僧凤、組合

ReactiveX是什么

??Rx是一種函數(shù)庫畜侦。

??不僅僅是一個函數(shù)庫,它還是一種編程思想的突破躯保。

??它是將復(fù)雜問題簡單化的一種工具旋膳。

ReactiveX核心概念

Observable(被觀察者、信號源)

Subscriber(觀察者)

Signal(信號)

*由Observable發(fā)送出一系列Signal,而Subscriber來處理Signal途事。

*Signal的類型分為Next验懊、Error、Completed等尸变。

*ReactiveX是一種觀察者模式但不只是觀察者模式

四個經(jīng)典場景

??用餐廳的業(yè)務(wù)來打比方义图,在下文中會列出四種比較經(jīng)典的模式。

小吃店模式

??首先我們先從小吃店模式講起召烂,此時業(yè)務(wù)流程如下:

????*客戶點單

????*店主制作餐品

????*店主將制作完成的餐品交付與客戶

??轉(zhuǎn)換為函數(shù)響應(yīng)式思想看來可以做以下劃分:

????店主:Observable

????客戶:Subscriber

????餐品:Signal

小吃店模式(代碼)
//店主
let foodMaker = Observable<Food>.create { observer -> Disposable in
//制作餐品
let food = CookFood()
//制作完成后將餐品傳遞給訂閱者
observer.onNext(food)
   return Disposables.create()
}
 
//顧客      
foodMaker.subscribe(onNext: { food in
   …
})

*create方法可創(chuàng)建一個自定義的Observable
*subscribe方法可以訂閱一個Observable

大排檔模式

??大排檔單單是食物是不夠的,用戶還需要把食物裝盤或者擺盤后才可以上菜碱工。
此時新增需求如下:
??食物制作完成后增加裝盤的流程
????Plan A:裝盤
????Plan B:擺盤

大排檔模式A(代碼)
//店主
let foodMaker = Observable<Food>.create { observer -> Disposable in
…
} 

.map { food -> PlateFood in
            //拿一個盤子
            let plateFood = PlateFood()
            //將食品裝盤
            foodBag.dish(food)
            //返回裝袋后的食物
            return plateFood
        }



//顧客      
foodMaker.subscribe(onNext: { food in
   …
})

*map高階函數(shù)可轉(zhuǎn)換信號為另一個值,甚至另一種類型

大排檔模式B(代碼)
//店主
let foodMaker = Observable<Food>.create { observer -> Disposable in
…
} 

.flatMap({ food -> Observable<FoodBag> in
        Observable<FoodBag>.create({ observer -> Disposable in
        //創(chuàng)建食品袋
        let foodBag = FoodBag()
        //將食品袋裝袋
        foodBag.packing(food)
        //返回裝袋后的食物
        observer.onNext(foodBag)
        return Disposables.create()
    })
})

//顧客      
foodMaker.subscribe(onNext: { food in
   …
})

*flapMap操作符可待發(fā)送信號后將其處理后轉(zhuǎn)換為另一個Observable簡單來說就是"串行"操作

酒店模式

??在酒店模式下奏夫,餐品的品質(zhì)應(yīng)該有所保證怕篷,因此需要過濾掉一部分不合格的餐品。
此時新增需求如下:
????餐品制作完成后會進行質(zhì)檢
????質(zhì)檢速度很快(非異步)

酒店模式(代碼)
let foodMaker = Observable<Food>.create { observer -> Disposable in
…
} 
.map { food -> PlateFood in
…
}
.filter { food -> Bool in
//根據(jù)實物的質(zhì)量判斷是否合格
return QualityControl(food)
}



//顧客      
foodMaker.subscribe(onNext: { food in
   …
})

*filter高階函根據(jù)返回的Bool值來過濾信號

客房送餐模式

??在客房送餐模式下酗昼,應(yīng)保證所有餐品都完成后廊谓,再進行送餐。
此時新增需求如下:
????多個餐品同時完成后再交付與顧客
????餐品耗時不一

客房送餐模式(代碼)

//前菜
let appetizerMaker = …
//主菜
let mainCourseMaker = …
//甜點
let dessertMaker = …
//酒水
let wineMaker = …

let foodDelivery =  Observable.zip(appetizerMaker,
                       mainCourseMaker,
                       dessertMaker,
                       wineMaker)

//顧客      
foodDelivery.subscribe(onNext: { food in
   …
})

*zip操作符可將多個Observable組合成為一個新的Observable麻削,
待所有Observable都發(fā)送信號后將所有統(tǒng)一發(fā)送(并行)

更多高階函數(shù)與操作符

??上面四個例子只是Rx*系列中操作符蒸痹、高階函數(shù)中的冰山一角
??更多操作符說明可以在ReactiveX官網(wǎng)上查詢到
??具體地址:http://reactivex.io/documentation/operators.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呛哟,隨后出現(xiàn)的幾起案子叠荠,更是在濱河造成了極大的恐慌,老刑警劉巖竖共,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俺祠,居然都是意外死亡公给,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門蜘渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淌铐,“玉大人,你說我怎么就攤上這事蔫缸⊥茸迹” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吐葱。 經(jīng)常有香客問我街望,道長,這世上最難降的妖魔是什么弟跑? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任灾前,我火速辦了婚禮,結(jié)果婚禮上孟辑,老公的妹妹穿的比我還像新娘哎甲。我一直安慰自己,他們只是感情好饲嗽,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布炭玫。 她就那樣靜靜地躺著,像睡著了一般貌虾。 火紅的嫁衣襯著肌膚如雪吞加。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天酝惧,我揣著相機與錄音榴鼎,去河邊找鬼。 笑死晚唇,一個胖子當(dāng)著我的面吹牛巫财,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哩陕,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼平项,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悍及?” 一聲冷哼從身側(cè)響起闽瓢,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎心赶,沒想到半個月后扣讼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡缨叫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年椭符,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耻姥。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡销钝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琐簇,到底是詐尸還是另有隱情蒸健,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站似忧,受9級特大地震影響渣叛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橡娄,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一诗箍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挽唉,春花似錦滤祖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至塑顺,卻和暖如春汤求,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背严拒。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工扬绪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裤唠。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓挤牛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親种蘸。 傳聞我的和親對象是個殘疾皇子墓赴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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