RxSwift 系列(四)

前言

本篇文章将要学习RxSwift中四种转换操作符:

  • map
  • flatMap
  • flatMapLatest
  • scan

map

通过使用一个闭包函数将原来的Observable序列转换为一个新的Observable序列。

let disposeBag = DisposeBag()

    Observable.of(1,2,3).map({return 10 * $0}).subscribe({print($0)}).disposed(by: disposeBag)

打印结果:

next(10)
next(20)
next(30)
completed

flatMap

将一个Observable序列转换为另一个Observable序列,并且合并两个Observable序列。会按时间顺序接收两个序列发出的元素。

let disposeBag = DisposeBag()

struct Player {
    var score:Variable<Int>
}

let man = Player(score: Variable(80))
let women = Player(score: Variable(90))

let player = Variable(man)
    player.asObservable().flatMap({$0.score.asObservable()}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

man.score.value = 85
player.value = women
man.score.value = 95
women.score.value = 100

打印结果:

80
85
90
95
100

flatMapLatest

flatMapLatestflatMap一样,也是将一个序列转换为另一个序列,flatMapLatest只会从最近的序列中发出事件。

flatMapLatest = map + switchLatest

  • 疑问:感觉和switchLatest没什么区别啊。(有哪位大佬帮忙解答一下么
let disposeBag = DisposeBag()

struct Player {
    var score:Variable<Int>
}

let man = Player(score: Variable(80))
let women = Player(score: Variable(90))

let player = Variable(man)
    player.asObservable().flatMapLatest({$0.score.asObservable()}).subscribe(onNext: {print($0)}).disposed(by: disposeBag)

man.score.value = 85
player.value = women
man.score.value = 95
women.score.value = 100

打印结果:

80
85
90
100

scan

scan就是提供一个初始化值,然后使用计算闭包不断将前一个元素和后一个元素进行处理,并将处理结果作为单个元素的Observable序列返回。

let disposeBag = DisposeBag()

Observable.of(10, 100, 1000)
    .scan(2) { aggregateValue, newValue in
        aggregateValue + newValue
    }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印结果:

12
112
1112

致谢

如果发现有错误的地方,欢迎评论,感谢!

时间: 2024-10-11 20:18:04

RxSwift 系列(四)的相关文章

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

Exchange 2013SP1和O365混合部署系列四

前面的三篇算是准备工作,今天我们看下如何在Exchange 2013 SP1中配置启用混合部署.老规矩,先看图,特别注意的我会,指出. 在EAC面板有个混合选项.点击启用.然后会登录到0365. 继续下一步. 继续下一步. 继续下一步. 远程迁移需要一张公网的证书. 继续下一步,需要输入凭据. 下面会自动开始配置. 混合部署到这里,算是配置完成. 组织里面多了本地到O365的通道. O365里面则相反的. 下篇我们将介绍本地新建O365账号和本地到O365的迁移. 先到这里. Exchange

ICMP拒绝服务攻击(原始套接字系列四)

拒绝服务攻击(DoS)企图通过使被攻击的计算机资源消耗殆尽从而不能再提供服务,拒绝服务攻击是最容易实施的攻击行为.中美黑客大战中的中国黑客一般对美进行的就是拒绝服务攻击,其技术手段大多不够高明. ICMP实现拒绝服务攻击的途径有二:一者"单刀直入",一者"借刀杀人".具体过程分析如下:   ICMPFLOOD攻击 大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应.中美黑客大战中的多数中国黑客采用的正是此项技术.ICMP FLOOD攻击实际上是

Lync Server 2010 安装部署系列四:安装&配置证书服务器

1.打开"服务器管理器" 2.添加角色 3.单击下一步按钮 4.勾选"Active Directory证书服务" 5.单击"下一步"按钮: 6.勾选"证书颁发机构"和"证书颁发机构Web注册",单击"下一步"按钮: 7.勾选"企业",单击"下一步"按钮: 8.勾选"根CA",单击"下一步"按钮: 9.勾选&q

sed修炼系列(四):sed中的疑难杂症

本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N"的纠葛 1.sed中使用变量和变量替换的问题 在脚本中使用sed的时候,很可能需要在sed中引用shell变量,甚至想在sed命令行中使用变量替换.也许很多人都遇到过这个问题,但引号却死活调试不出正确的位置.其实这不是sed的问题,而是shell的特性.搞懂sed如何解决引号的问题,对理解shell引号问题有

So Easy! Oracle在Linux上的安装配置系列四

So Easy! Oracle在Linux上的安装配置系列四  监听器的配置 在创建了数库和各种数据库对象并装载了数据后,下一步是在数据库服务器与使用它的用户之间建立连 接,Oracle Net Services使这种连接成为可能.Oracle Net Services组件必须"存活"在客户机和服务器上,它们一般使用TCP/IP网络协议来建立客户机和数据库服务器之间的网络连接. 本文官方文档位置: http://docs.oracle.com/cd/E11882_01/network.

RxSwift 系列(三)

RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable.Combination Operators在RxSwift中的实现有五种: startWith merge zip combineLatest switchLatest startWith 在Observable释放元素之前,发射指定的元素序列.更多详情上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东

Apache Kafka系列(四) 多线程Consumer方案

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程Consumer方案 本文的图片是通过PPT截图出的,读者如果修改意见请联系我 一.Consumer为何需要实现多线程 假设我们正在开发一个消息通知模块,该模块允许用户订阅其他用户发送的通知/消息.该消息通知模块采用Apache Kafka,那么整个架构应该是消息的发布者通过Producer调用AP

Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) )

说明: 本博客为补全上篇-Java-单机版的书店管理系统(练习设计模块和思想_系列 四(1) )的,所以如果不懂,请先看上一篇. 本系列都是我一步一步学习来的, 所以,可能比较适合初学设计模块的人来学. 现在补全我目前写的所以代码: 公共类: 用户类型枚举:UserTypeEnum类 package cn.hncu.bookStore.common; /** * 功能:用户类型的枚举!<br/> * 定义在公共模块.<br/> * 变量:<br/> * ADMIN(1,