美文网首页
深入浅出RxSwift

深入浅出RxSwift

作者: SuperrrrrrrK | 来源:发表于2017-09-20 14:07 被阅读0次

写在前面

  最近使用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

相关文章

网友评论

      本文标题:深入浅出RxSwift

      本文链接:https://www.haomeiwen.com/subject/fggnsxtx.html