自主学习之RxSwift(二) -----flatMap
最近项目中有这么一个需求,下面是三个网络请求
A.从服务器获取到时间戳(GET 方法,获取 timeLine)
B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeLine,Image )
C.对用户信息进行设置(POST方,参数为 timeLine, avatarURL, userId)
对这个情景简单分析,不难得出一个结论,B依赖于A的返回结果,C依赖于A,B的返回结果,这个时候如果按照我们普通的做法,其实是很麻烦的一件事情,想必大家也都知道该怎么做,下面不妨来看下RxSwift的例子,来看看他到底多强大。
首先是一个网络请求的方法封装:(此处以获取timeLine为例,其他方法基本相同)
func rx_getTimeStamp() -> Observable<AnyObject> {
return Observable.create({ (observer) -> Disposable in
let request = Alamofire.request(.GET, BaseUrl + NetAPI.GetTimeStamp.rawValue)
.responseJSON(completionHandler: { (firedResponse) -> Void in
if let value = firedResponse.result.value {
observer.onNext(value)
observer.onCompleted()
} else if let error = firedResponse.result.error {
observer.onError(error)
}
})
return AnonymousDisposable{
request.cancel()
}
})
}
其次就是具体代码的实现
//从服务器获取时间戳
let getTimeValue = NetTool.netToolObj.rx_getTimeStamp()
.map({ value in
return JSON(value)["data"]["timestamp"].stringValue
})
.shareReplay(1)
//根据获取的时间戳,来上传用户头像,将获取的结果进行解析,得到头像url
let avatarUrlValue = getTimeValue.flatMap({ timeStamp in
NetTool.netToolObj.rx_uploadAvatar(NetAPI.Upload.rawValue, image: image!, params:["uid": "5", "timeStamp": timeStamp])
})
.map({ value in
return JSON(value)["data"]["url"].stringValue
})
.shareReplay(1)
//压缩 时间戳请求和头像上传请求,将获取到的结果,加入到 设置用户信息的请求参数中
Observable.zip(getTimeValue, avatarUrlValue, resultSelector: { (timeStamp, avatarUrl) in
return self.setParmas(avatarUrl, timeStamp: timeStamp)//(设置字典)
})
.flatMap({ dict in
NetTool.netToolObj.rx_netWork(.POST, netType: NetAPI.SetFirstUserInfo, params: dict)
})
.subscribeNext({ returnObj in
print(returnObj)
})
.addDisposableTo(disposeBag)
flatMap,
在此究竟发挥了什么作用呢,他的返回值是
Observable<O.E>,因此在此,他联系了上下的网络请求,将上一步的结果加入到网络请求里面,然后再将网络请求结果,返回为Observable<O.E>,再进行下一次的操作
当然我也是RxSwift的初学者,其中有什么错误,希望大神赐教。
转载于:https://www.cnblogs.com/melons/p/5791969.html
自主学习之RxSwift(二) -----flatMap相关推荐
- 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad
[摘要]本文是Rxjs 响应式编程-第二章:序列的深入研究这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 划重点 文中使用到 ...
- 高效人士的七个好习惯
七个习惯 ☆习惯一.主动积极 ☆习惯二.以终为始 ☆习惯三.要事第一 ☆习惯四.双赢思维 ☆习惯五.知己解彼 ☆习惯六.统合终效 ☆习惯七.不断更新 基本原则篇 ☆介绍 ☆持续成熟模式 ☆原则 ☆思维 ...
- 小学计算机神奇的因特网教案,小学信息技术第三册全册教案(第一单元 神奇的动画城)...
<小学信息技术第三册全册教案(第一单元 神奇的动画城)>由会员分享,可在线阅读,更多相关<小学信息技术第三册全册教案(第一单元 神奇的动画城)(60页珍藏版)>请在人人文库网上 ...
- 秋招冲刺:网络安全工程师入围成功之旅!!
秋招 前言 大一 大二 个人感受 前言 又到了每年校招的时刻,回想起2018年校招的我,只能说一把辛酸泪. 作为一名某不知名学校的本科生,大学学的专业是网络工程专业,虽然学校不算太差,但在各种211. ...
- java8新特性之Stream流
一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...
- Flink的Source端和Sink端大全
Flink和各种组件 enviroment Source flink + kafka (flink 消费 kafka 中的数据) Transform Transformation 的介绍 复杂的方法 ...
- 在“iEnglish英语风采”中,看到“双减”本质
作者 | 曾响铃 文 | 响铃说 对于大多数的中国孩子来说,掌握英语似乎是一件"老大难"的事情. 但近日在中国教育电视台播出的英语类少儿成长记实节目"iEnglish风采 ...
- js二维数组和多维数组 flatMap ( )
二维数组 先来打印一个二维数组 var arr=[]; for(var i=0;i<10;i++){arr[i]=[];for(var j=0;j<10;j++){arr[i][j]=i* ...
- 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap
目录 扁平化映射 | flatMap 定义 案例 扁平化映射 flatMap 扁平化映射也是将来用得非常多的操作,也是必须要掌握的. 定义 可以把flatMap,理解为先map,然后再flatten ...
最新文章
- MATLAB中PI调节器设计,华中科技大学电气学院matlab选修课大作业pi控制器的设计...
- UDP千兆以太网FPGA_verilog实现(四、代码前期准备-UDP和IP协议构建)
- oracle分区list,Oracle 分区表中存在range-list表分区时遇到问题及解决办法
- linux rsync 原理,rsync 同步原理和类别
- easypoi list中的map导出_Java中的集合类(List,Set.Map)
- mysql过滤器_MYSQL复制过滤器
- [react] React v15中怎么处理错误边界?
- 李航《统计学习方法》之HMM隐马尔可夫模型
- 机器学习实战——决策树:matplotlib绘图
- C++ new和delete 堆和栈
- hastable与dictionary
- Ubuntu20.04安装OpenCV3.4.15
- Atitit 分布式文件系统 hdfs nfs fastfs 目录 1. 分布式文件系统	1 2. 什么是FastDFS	1 2.1. FastDFS特性:	1 2.1.1. fastdfs是否可在
- 不兼容惹的祸,Calibre 作者拒绝迁移至 Python 3
- 如何在ImageRanger中设置人脸识别来整理照片分类
- java开源社区 推荐_13 个最火的 Java 开源项目推荐!总有一个适合你!
- Excel如何一次性将多行多列表格颠倒行顺序
- Eege浏览器和Chrome浏览器选中文本朗读
- java isbn_ISBN书号查询示例代码
- asa清空配置_思科ASA基本配置