• [RxSwift教程]9、过滤操作符:filter、take、skip等


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(let_us_code)
    ➤博主域名:https://www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    强烈推荐!!!试用博主个人App作品!提需求!提建议!
    App Store搜索:【Mind Draft
    中国区可直接点击跳转:【Mind Draft

    九、过滤操作符(Filtering Observables)

    过滤操作指的是从源 Observable 中选择特定的数据发送。
     

    1,filter

    (1)基本介绍
    • 该操作符就是用来过滤掉某些不符合要求的事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    let disposeBag = DisposeBag()
     
    Observable.of(2, 30, 22, 5, 60, 3, 40 ,9)
        .filter {
            $0 > 10
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    运行结果如下:

    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    2,distinctUntilChanged

    (1)基本介绍
    • 该操作符用于过滤掉连续重复的事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 1, 1, 4)
        .distinctUntilChanged()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    运行结果:

    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    3,single

    (1)基本介绍
    • 限制只发送一次事件,或者满足条件的第一个事件。
    • 如果存在有多个事件或者没有事件都会发出一个 error 事件。
    • 如果只有一个事件,则不会发出 error 事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .single{ $0 == 2 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    Observable.of("A""B""C""D")
        .single()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    运行结果:

    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    4,elementAt

    (1)基本介绍
    • 该方法实现只处理在指定位置的事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .elementAt(2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    5,ignoreElements

    (1)基本介绍
    • 该操作符可以忽略掉所有的元素,只发出 error 或 completed 事件。
    • 如果我们并不关心 Observable 的任何元素,只想知道 Observable 在什么时候终止,那就可以使用 ignoreElements 操作符。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .ignoreElements()
        .subscribe{
            print($0)
        }
        .disposed(by: disposeBag)
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    6,take

    (1)基本介绍
    • 该方法实现仅发送 Observable 序列中的前 n 个事件,在满足数量之后会自动 .completed。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .take(2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    7,takeLast

    (1)基本介绍
    • 该方法实现仅发送 Observable 序列中的后 n 个事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .takeLast(1)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    8,skip

    (1)基本介绍
    • 该方法用于跳过源 Observable 序列发出的前 n 个事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
     
    Observable.of(1, 2, 3, 4)
        .skip(2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    9,Sample

    (1)基本介绍
    • Sample 除了订阅源 Observable 外,还可以监视另外一个 Observable, 即 notifier 。
    • 每当收到 notifier 事件,就会从源序列取一个最新的事件并发送。而如果两次 notifier 事件之间没有源序列的事件,则不发送值。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    let disposeBag = DisposeBag()
     
    let source = PublishSubject<Int>()
    let notifier = PublishSubject<String>()
     
    source
        .sample(notifier)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    source.onNext(1)
     
    //让源序列接收接收消息
    notifier.onNext("A")
     
    source.onNext(2)
     
    //让源序列接收接收消息
    notifier.onNext("B")
    notifier.onNext("C")
     
    source.onNext(3)
    source.onNext(4)
     
    //让源序列接收接收消息
    notifier.onNext("D")
     
    source.onNext(5)
     
    //让源序列接收接收消息
    notifier.onCompleted()
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

    10,debounce

    (1)基本介绍
    • debounce 操作符可以用来过滤掉高频产生的元素,它只会发出这种元素:该元素产生后,一段时间内没有新元素产生。
    • 换句话说就是,队列中的元素如果和下一个元素的间隔小于了指定的时间间隔,那么这个元素将被过滤掉。
    • debounce 常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
     
            //定义好每个事件里的值以及发送的时间
            let times = [
                "value": 1, "time": 0.1 ],
                "value": 2, "time": 1.1 ],
                "value": 3, "time": 1.2 ],
                "value": 4, "time": 1.2 ],
                "value": 5, "time": 1.4 ],
                "value": 6, "time": 2.1 ]
            ]
             
            //生成对应的 Observable 序列并订阅
            Observable.from(times)
                .flatMap { item in
                    return Observable.of(Int(item["value"]!))
                        .delaySubscription(Double(item["time"]!),
                                           scheduler: MainScheduler.instance)
                }
                .debounce(0.5, scheduler: MainScheduler.instance) //只发出与下一个间隔超过0.5秒的元素
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
        }
    }
    运行结果如下:
    原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
     
  • 相关阅读:
    Max Sum(经典DP)
    Codeforces Round #166 (Div. 2)D. Good Substrings(字符串散列)
    Edge(简单)
    Just a Hook(线段树,成段更新)
    Codeforces Round #169 (Div. 2) D. Little Girl and Maximum XOR(贪心,中等)
    最大连续子序列(经典DP)
    Compromise(求解最长公共子序列并输出)
    如何查看IE型号
    并查集中Sfind函数的返回值错误,伤了我两天~!
    最大流的非递归Dinic算法
  • 原文地址:https://www.cnblogs.com/strengthen/p/13673497.html
Copyright © 2020-2023  润新知