自主学习之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的初学者,其中有什么错误,希望大神赐教。
自主学习之RxSwift(二) -----flatMap的更多相关文章
- 自主学习之RxSwift(一) -----Driver
对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...
- swift使用查阅资料备份3
自主学习之RxSwift(二) -----flatMap https://blog.csdn.net/chelongfei/article/details/50995603 RxSwift 系列(九) ...
- 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad
目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...
- RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy
1.buffer的基本使用 let publishSubject = PublishSubject<String>() //buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参 ...
- RxSwift 系列(二) -- Subject
前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...
- RxSwift 系列(二)
前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...
- 大神都在看的RxSwift 的完全入坑手册
大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ...
- Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...
- geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG还原 查找BUG 解决方案 总结 后记 一.前 ...
随机推荐
- 一个题目涉及到的50个Sql语句
原博客地址 http://blog.csdn.net/maco_wang/article/details/6281484 Student(S#,Sname,Sage,Ssex) 学生表 Course( ...
- 24时区,GMT,UTC,DST,CST时间详解
全球24个时区的划分 相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟 ...
- angular何时触发脏检查机制
ng只有在指定事件触发后,才进入$digest cycle: DOM事件,譬如用户输入文本,点击按钮等.(ng-click) XHR响应事件 ($http) 浏览器Location变更事件 ($loc ...
- Android 音视频编解码——RGB与YUV格式转换
一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...
- 基于 HTML5 WebGL 的 3D 机房
前言 用 WebGL 渲染的 3D 机房现在也不是什么新鲜事儿了,这篇文章的主要目的是说明一下,3D 机房中的 eye 和 center 的问题,刚好在项目中用上了,好生思考了一番,最终觉得这个例子最 ...
- Win10下Ubuntu bash上手
第一次发表博客,可能写的不是很好,希望大家谅解! 今天咱们来上手一下Windows10下的bash,首先这款bash是基于Ubuntu操作系统的一个移植,也是方便开发和学习Linux中的shell命令 ...
- 求数组中最小的k个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.Arra ...
- NodeJS 远程连接windows 上的MongoDB
---恢复内容开始--- 在购买了腾讯云主机,部署了nodejs项目之后,发现没有mongo数据库,于是在官网上下载了最新版的mongo数据库.然后就有了下边的一系列问题. 1.先说说基础配置吧. 1 ...
- 关于在Editplus中设置内容提示比如syso的快捷输出的方法
在Editplus中默认的内容提示是很少的,比如我们最常用的syso快捷输出就没有,那么怎么来设置呢? 首先打开工具-首选项: 然后打开文件类型及语法-在文件类型中打开Java,如图: 然后打开 我们 ...
- 我的linux学习之路——(一)
prompt:命令提示符 命令: command options...... arguments...... 选项: 短选项 长选项 带参数的选项 参数: list----ls 列出,列表 列出制定路 ...