深入浅出RxSwift

写在前面

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容