寫在前面
??最近使用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