写在前面
最近使用RxSwift做项目也有段时间了。
现在使用RxSwift做开发的给我个人的感觉就像开了个挂一样。23333
但是不得不承认, 刚开始接触RxSwift的时候给我的感觉就是"这破玩意有什么用"
我写了四个比较有意思的场景,抛砖引玉,也许可以给一些正要学习使用RxSwift的人一些启发。
在正式提出场景之前先简单介绍一下相关概念以及我的理解。
什么是函数响应式编程
一句话:函数响应式编程就是处理异步数据交互的一种编程范式。
核心概念: 数据流、拆分、组合
ReactiveX是什么
Rx是一种函数库。
不仅仅是一个函数库,它还是一种编程思想的突破。
它是将复杂问题简单化的一种工具。
ReactiveX核心概念
Observable(被观察者、信号源)
Subscriber(观察者)
Signal(信号)
*由Observable发送出一系列Signal,而Subscriber来处理Signal。
*Signal的类型分为Next、Error、Completed等。
*ReactiveX是一种观察者模式但不只是观察者模式
四个经典场景
用餐厅的业务来打比方,在下文中会列出四种比较经典的模式。
小吃店模式
首先我们先从小吃店模式讲起,此时业务流程如下:
*客户点单
*店主制作餐品
*店主将制作完成的餐品交付与客户
转换为函数响应式思想看来可以做以下划分:
店主: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方法可创建一个自定义的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高阶函数可转换信号为另一个值,甚至另一种类型
大排档模式B(代码)
//店主
let foodMaker = Observable<Food>.create { observer -> Disposable in
…
}
.flatMap({ food -> Observable<FoodBag> in
Observable<FoodBag>.create({ observer -> Disposable in
//创建食品袋
let foodBag = FoodBag()
//将食品袋装袋
foodBag.packing(food)
//返回装袋后的食物
observer.onNext(foodBag)
return Disposables.create()
})
})
//顾客
foodMaker.subscribe(onNext: { food in
…
})
*flapMap操作符可待发送信号后将其处理后转换为另一个Observable简单来说就是"串行"操作
酒店模式
在酒店模式下,餐品的品质应该有所保证,因此需要过滤掉一部分不合格的餐品。
此时新增需求如下:
餐品制作完成后会进行质检
质检速度很快(非异步)
酒店模式(代码)
let foodMaker = Observable<Food>.create { observer -> Disposable in
…
}
.map { food -> PlateFood in
…
}
.filter { food -> Bool in
//根据实物的质量判断是否合格
return QualityControl(food)
}
//顾客
foodMaker.subscribe(onNext: { food in
…
})
*filter高阶函根据返回的Bool值来过滤信号
客房送餐模式
在客房送餐模式下,应保证所有餐品都完成后,再进行送餐。
此时新增需求如下:
多个餐品同时完成后再交付与顾客
餐品耗时不一
客房送餐模式(代码)
//前菜
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都发送信号后将所有统一发送(并行)
更多高阶函数与操作符
上面四个例子只是Rx*系列中操作符、高阶函数中的冰山一角
更多操作符说明可以在ReactiveX官网上查询到
具体地址:http://reactivex.io/documentation/operators.html