美文网首页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几个常用高阶函数介绍

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