最近项目中有这么一个需求,下面是三个网络请求

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的更多相关文章

  1. 自主学习之RxSwift(一) -----Driver

    对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...

  2. swift使用查阅资料备份3

    自主学习之RxSwift(二) -----flatMap https://blog.csdn.net/chelongfei/article/details/50995603 RxSwift 系列(九) ...

  3. 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad

    目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...

  4. RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy

    1.buffer的基本使用 let publishSubject = PublishSubject<String>() //buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参 ...

  5. RxSwift 系列(二) -- Subject

    前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...

  6. RxSwift 系列(二)

    前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...

  7. 大神都在看的RxSwift 的完全入坑手册

    大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ...

  8. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  9. geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG还原 查找BUG 解决方案 总结 后记 一.前 ...

随机推荐

  1. Python机器学习:5.6 使用核PCA进行非线性映射

    许多机器学习算法都有一个假设:输入数据要是线性可分的.感知机算法必须针对完全线性可分数据才能收敛.考虑到噪音,Adalien.逻辑斯蒂回归和SVM并不会要求数据完全线性可分. 但是现实生活中有大量的非 ...

  2. 【BZOJ1798】【AHOI2009】维护序列(线段树)

    题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...

  3. 细说css中的position属性

    有过css开发经验的同学,对于position这个属性一定不会陌生,然而这个熟悉的属性确是面试题中的常客,也就说明了该属性在css的世界是有一定的江湖地位的,那么我们就来详细的说说position这个 ...

  4. 解决:安装oracle客户端,提示“oracle11g所选的主目录位于基目录外”

    安装oracle客户端,第三步下一步的时候,提示"oracle11g所选的主目录位于基目录外": 默认  Oracle基目录:D:\app\xxx 原      软件位置:F:\p ...

  5. PHP接收android传过来的图片

    在android手机app上,上传图片,PHP服务端接收图片需要一下步骤 1 需要android 开发人员 把图片转成base64格式 2 PHP端接收转化后的base64字符串,然后进行转译 fun ...

  6. 开发中使用Gson的实例(时间格式错误解决方法)

    ...... // 通过GSON解析,使用4个实体类来接受(TotalResponse.TradeRateResponse.TradeRatess.TbTradeRates) GsonBuilder ...

  7. Error:Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package name 'com.fortythree.sos.flashlight'

    Q:导入json文件时的包名不对 A:包名存在的位置是app build gradle中的applicationID

  8. 进程互斥 Peterson算法

    转自http://blog.csdn.net/l294265421/article/details/46674847 假设有两个进程需要互斥的访问某一个临界区. Peterson算法的形式如下: en ...

  9. CentOS7安装最新版git教程

    下载编译工具 yum -y groupinstall "Development Tools" 下载依赖包 yum -y install zlib-devel perl-ExtUti ...

  10. IPFS和竞争对手们(二)

    在上一篇<IPFS和竞争对手们(一)>的开头抱怨的IPFS的开发进度,今天才得知 MaidSafe 是从2006年起步的( )这进度也是醉了. 接上一篇,今天继续讲IPFS的竞争对手们 图 ...