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

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相关推荐

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

    [摘要]本文是Rxjs 响应式编程-第二章:序列的深入研究这篇文章的学习笔记. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 划重点 文中使用到 ...

  2. 高效人士的七个好习惯

    七个习惯 ☆习惯一.主动积极 ☆习惯二.以终为始 ☆习惯三.要事第一 ☆习惯四.双赢思维 ☆习惯五.知己解彼 ☆习惯六.统合终效 ☆习惯七.不断更新 基本原则篇 ☆介绍 ☆持续成熟模式 ☆原则 ☆思维 ...

  3. 小学计算机神奇的因特网教案,小学信息技术第三册全册教案(第一单元 神奇的动画城)...

    <小学信息技术第三册全册教案(第一单元 神奇的动画城)>由会员分享,可在线阅读,更多相关<小学信息技术第三册全册教案(第一单元 神奇的动画城)(60页珍藏版)>请在人人文库网上 ...

  4. 秋招冲刺:网络安全工程师入围成功之旅!!

    秋招 前言 大一 大二 个人感受 前言 又到了每年校招的时刻,回想起2018年校招的我,只能说一把辛酸泪. 作为一名某不知名学校的本科生,大学学的专业是网络工程专业,虽然学校不算太差,但在各种211. ...

  5. java8新特性之Stream流

    一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...

  6. Flink的Source端和Sink端大全

    Flink和各种组件 enviroment Source flink + kafka (flink 消费 kafka 中的数据) Transform Transformation 的介绍 复杂的方法 ...

  7. 在“iEnglish英语风采”中,看到“双减”本质

    作者 | 曾响铃 文 | 响铃说 对于大多数的中国孩子来说,掌握英语似乎是一件"老大难"的事情. 但近日在中国教育电视台播出的英语类少儿成长记实节目"iEnglish风采 ...

  8. js二维数组和多维数组 flatMap ( )

    二维数组 先来打印一个二维数组 var arr=[]; for(var i=0;i<10;i++){arr[i]=[];for(var j=0;j<10;j++){arr[i][j]=i* ...

  9. 2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap

    目录 扁平化映射 | flatMap 定义 案例 扁平化映射  flatMap 扁平化映射也是将来用得非常多的操作,也是必须要掌握的. 定义 可以把flatMap,理解为先map,然后再flatten ...

最新文章

  1. MATLAB中PI调节器设计,华中科技大学电气学院matlab选修课大作业pi控制器的设计...
  2. UDP千兆以太网FPGA_verilog实现(四、代码前期准备-UDP和IP协议构建)
  3. oracle分区list,Oracle 分区表中存在range-list表分区时遇到问题及解决办法
  4. linux rsync 原理,rsync 同步原理和类别
  5. easypoi list中的map导出_Java中的集合类(List,Set.Map)
  6. mysql过滤器_MYSQL复制过滤器
  7. [react] React v15中怎么处理错误边界?
  8. 李航《统计学习方法》之HMM隐马尔可夫模型
  9. 机器学习实战——决策树:matplotlib绘图
  10. C++ new和delete 堆和栈
  11. hastable与dictionary
  12. Ubuntu20.04安装OpenCV3.4.15
  13. Atitit 分布式文件系统 hdfs nfs fastfs 目录 1. 分布式文件系统 1 2. 什么是FastDFS 1 2.1. FastDFS特性: 1 2.1.1. fastdfs是否可在
  14. 不兼容惹的祸,Calibre 作者拒绝迁移至 Python 3
  15. 如何在ImageRanger中设置人脸识别来整理照片分类
  16. java开源社区 推荐_13 个最火的 Java 开源项目推荐!总有一个适合你!
  17. Excel如何一次性将多行多列表格颠倒行顺序
  18. Eege浏览器和Chrome浏览器选中文本朗读
  19. java isbn_ISBN书号查询示例代码
  20. asa清空配置_思科ASA基本配置

热门文章

  1. switch( )的经典引用
  2. HDU 1232畅通工程
  3. ValueError: Must have equal len keys and value when setting with an iterable
  4. BeautifulSoup总结
  5. 可视化卷及神经网络热力图
  6. Ubuntu 使用root 帐号开启 SSH 登录
  7. pip安装时报错:以一种访问权限不允许的方式做了一个访问套接字的尝试
  8. Django--django安装和HTTP协议
  9. 高级软件工程第五次作业:东理三剑客团队作业-2
  10. ios浏览器不支持onblur事件