美文网首页iOS第三方库
RxSwift(四)-- RxSwift几个常用高阶函数介绍

RxSwift(四)-- RxSwift几个常用高阶函数介绍

作者: Daniel_Harvey | 来源:发表于2019-08-01 15:34 被阅读0次

对于RxSwift的重点学习,我们还得需要知道RxSwift的高阶函数,掌握好了RxSwift的高阶函数,是你通往成功的捷径,这篇文章,我来介绍几个我觉得很重要的RxSwift的高阶函数,便于以后自己查阅。

filter

  • filter函数仅仅发出Observable中通过判定的元素
  • 它将通过你提供的判定方法过滤一个Observable

代码演示如下:

let disposeBag = DisposeBag()

Observable.of(2, 30, 22, 5, 60, 1)
          .filter { $0 > 10 }
          .subscribe(onNext: { print($0) })
          .disposed(by: disposeBag)

输出结果:

30
22
60

flatMap

  • Observable 的元素转换成其他的 Observable,然后将这些 Observables 合并
  • flatMap 操作符将源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。 然后将这些 Observables 的元素合并之后再发送出来。
  • 这个操作符是非常有用的,例如,当 Observable 的元素本身拥有其他的 Observable 时,你可以将所有子 Observables 的元素发送出来。

代码演示如下:

let disposeBag = DisposeBag()
let first = BehaviorSubject(value: "👦🏻")
let second = BehaviorSubject(value: "🅰️")
let variable = Variable(first)

variable.asObservable()
        .flatMap { $0 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

first.onNext("🐱")
variable.value = second
second.onNext("🅱️")
first.onNext("🐶")

输出结果:

👦🏻
🐱
🅰️
🅱️
🐶

flatMapLatest

  • Observable 的元素转换成其他的 Observable,然后取这些 Observables 中最新的一个
  • flatMapLatest 操作符将源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。一旦转换出一个新的 Observable,就只发出它的元素,旧的 Observables 的元素将被忽略掉。
  • 将其与flatMap比较学习更容易理解

代码演示如下:

let disposeBag = DisposeBag()
let first = BehaviorSubject(value: "👦🏻")
let second = BehaviorSubject(value: "🅰️")
let variable = Variable(first)

variable.asObservable()
        .flatMapLatest { $0 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

first.onNext("🐱")
variable.value = second
second.onNext("🅱️")
first.onNext("🐶")

输出结果:

👦🏻
🐱
🅰️
🅱️

distinctUntilChanged

  • 阻止 Observable 发出相同的元素
  • distinctUntilChanged 操作符将阻止 Observable 发出相同的元素。如果后一个元素和前一个元素是相同的,那么这个元素将不会被发出来。如果后一个元素和前一个元素不相同,那么这个元素才会被发出来。

代码演示如下:

let disposeBag = DisposeBag()

Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
    .distinctUntilChanged()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出结果:

🐱
🐷
🐱
🐵
🐱

elementAt

  • 只发出 Observable 中的第 n 个元素
  • elementAt 操作符将拉取 Observable 序列中指定索引数的元素,然后将它作为唯一的元素发出。

代码演示如下:

let disposeBag = DisposeBag()

Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .elementAt(3)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出结果:

🐸

ignoreElements

  • 忽略掉所有的元素,只发出 errorcompleted 事件
  • ignoreElements 操作符将阻止 Observable 发出 next 事件,但是允许他发出 errorcompleted 事件。
  • 如果你并不关心 Observable 的任何元素,你只想知道 Observable 在什么时候终止,那就可以使用 ignoreElements 操作符。

take

  • 仅仅从 Observable 中发出头 n 个元素
    通过 take 操作符你可以只发出头 n 个元素。并且忽略掉后面的元素,直接结束序列

代码演示如下:

let disposeBag = DisposeBag()

Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .take(3)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出结果:

🐱
🐰
🐶

takeLast

  • 仅仅从 Observable 中发出尾部 n 个元素
  • 通过 takeLast 操作符你可以只发出尾部 n 个元素。并且忽略掉前面的元素。

代码演示如下:

let disposeBag = DisposeBag()

Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .takeLast(3)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出结果:

🐸
🐷
🐵

skip

  • 跳过 Observable 中头 n 个元素
  • skip 操作符可以让你跳过 Observable 中头 n 个元素,只关注后面的元素。

代码演示如下:

let disposeBag = DisposeBag()

Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .skip(2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

输出结果:

🐶
🐸
🐷
🐵

sample

  • sample 操作符将不定期的对源 Observable 进行取样操作。通过第二个 Observable 来控制取样时机。一旦第二个 Observable 发出一个元素,就从源 Observable 中取出最后产生的元素。

debounce

  • 过滤掉高频产生的元素
  • debounce 操作符将发出这种元素,在 Observable 产生这种元素后,一段时间内没有新元素产生。

groupBy

  • 将源 Observable 分解为多个子 Observable,并且每个子 Observable 将源 Observable 中“相似”的元素发送出来
  • groupBy 操作符将源 Observable 分解为多个子 Observable,然后将这些子 Observable 发送出来。它会将元素通过某个键进行分组,然后将分组后的元素序列以 Observable 的形态发送出来。

concatMap

  • Observable 的元素转换成其他的 Observable,然后将这些 Observables串连起来
  • concatMap 操作符将源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。然后让这些 Observables 按顺序的发出元素,当前一个 Observable 元素发送完毕后,后一个 Observable 才可以开始发出元素。等待前一个 Observable 产生完成事件后,才对后一个 Observable 进行订阅。

代码演示如下:

let disposeBag = DisposeBag()

let subject1 = BehaviorSubject(value: "🍎")
let subject2 = BehaviorSubject(value: "🐶")

let variable = Variable(subject1)

variable.asObservable()
        .concatMap { $0 }
        .subscribe { print($0) }
        .disposed(by: disposeBag)

subject1.onNext("🍐")
subject1.onNext("🍊")

variable.value = subject2

subject2.onNext("I would be ignored")
subject2.onNext("🐱")

subject1.onCompleted()

subject2.onNext("🐭")

输出结果:

next(🍎)
next(🍐)
next(🍊)
next(🐱)
next(🐭)

map

  • 通过一个转换函数,将 Observable 的每个元素转换一遍
  • map 操作符将源 Observable 的每个元素应用你提供的转换方法,然后返回含有转换结果的 Observable

代码演示如下:

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

输出结果:

10
20
30

常用的高阶函数大概就这些了,需要了解其他知识,请往这里看👀RxSwift

相关文章

  • RxSwift(四)-- RxSwift几个常用高阶函数介绍

    对于RxSwift的重点学习,我们还得需要知道RxSwift的高阶函数,掌握好了RxSwift的高阶函数,是你通往...

  • RxSwift 深入浅出(二)高阶函数

    RxSwift 这个框架看我就够了,这一篇我重点介绍高阶函数,掌握好RxSwift的高阶函数,是你通往成功的捷径。...

  • RxSwift(二)

    一、常用的RxSwift高阶函数 1、just 2、drive 3、combineLatest 序列组合 4、ma...

  • RxSwift(四)高阶函数

    @TOC 我们知道Swift中有很多高阶函数,非常好用,而且效率都很高,如我们经常使用的map,fliter,fl...

  • RxSwift(四) 高阶函数

    注意:使用RxSwift.Resources.total需要在Podfile中添加

  • RxSwift基础讲解

    RxSwift:RxSwift是一个使用可观察序列和函数式操作符编写异步和基于事件的代码的库。RxSwift常用的...

  • RxSwift-高阶函数(四)

    Rxswift的高阶函数在我们程序员实际开发中可以极大的提高我们的开发效率,他几乎可以满足我们日常开发的大部分需求...

  • Swift - RxSwift入门介绍

    RxSwift介绍 RxSwift主页RxSwift中文文档 RxSwift 是 ReactiveX 家族的重要一...

  • RxSwift 了解

    RxSwift-github地址 RxSwift中文翻译 RxSwift视频教程 RxSwift介绍 RxSwif...

  • RxSwift高阶函数skip解读

    RxSwift高阶函数skip解读 skip skip的作用:跳过 Observable 中头 n 个元素,只关注...

网友评论

    本文标题:RxSwift(四)-- RxSwift几个常用高阶函数介绍

    本文链接:https://www.haomeiwen.com/subject/kotcdctx.html