zoukankan      html  css  js  c++  java
  • [RxSwift教程]14、其他操作符:delay、materialize、timeout等

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

    十四、其他一些实用的操作符(Observable Utility Operators)

    1,delay

    (1)基本介绍
    • 该操作符会将 Observable 的所有元素都先拖延一段设定好的时间,然后才将它们发送出来。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
             
            Observable.of(1, 2, 1)
                .delay(3, scheduler: MainScheduler.instance) //元素延迟3秒才发出
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
        }
    }

    运行结果如下:

    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
      

    2,delaySubscription

    (1)基本介绍
    • 使用该操作符可以进行延时订阅。即经过所设定的时间后,才对 Observable 进行订阅操作。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
             
            Observable.of(1, 2, 1)
                .delaySubscription(3, scheduler: MainScheduler.instance) //延迟3秒才开始订阅
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
        }
    }

    运行结果如下:

    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)

    3,materialize

    (1)基本介绍
    • 该操作符可以将序列产生的事件,转换成元素。
    • 通常一个有限的 Observable 将产生零个或者多个 onNext 事件,最后产生一个 onCompleted 或者 onError 事件。而 materialize 操作符会将 Observable 产生的这些事件全部转换成元素,然后发送出来。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
             
            Observable.of(1, 2, 1)
                .materialize()
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
        }
    }

    运行结果如下,可以和上面的样例比较下:
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
     

    4,dematerialize

    (1)基本介绍
    • 该操作符的作用和 materialize 正好相反,它可以将 materialize 转换后的元素还原。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
             
            Observable.of(1, 2, 1)
                .materialize()
                .dematerialize()
                .subscribe(onNext: { print($0) })
                .disposed(by: disposeBag)
        }
    }
    运行结果如下:
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)

    5,timeout

    (1)基本介绍
    使用该操作符可以设置一个超时时间。如果源 Observable 在规定时间内没有发任何出元素,就产生一个超时的 error 事件。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (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
    33
    34
    35
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        let disposeBag = DisposeBag()
         
        override func viewDidLoad() {
             
            //定义好每个事件里的值以及发送的时间
            let times = [
                "value": 1, "time": 0 ],
                "value": 2, "time": 0.5 ],
                "value": 3, "time": 1.5 ],
                "value": 4, "time": 4 ],
                "value": 5, "time": 5 ]
            ]
             
            //生成对应的 Observable 序列并订阅
            Observable.from(times)
                .flatMap { item in
                    return Observable.of(Int(item["value"]!))
                        .delaySubscription(Double(item["time"]!),
                                           scheduler: MainScheduler.instance)
                }
                .timeout(2, scheduler: MainScheduler.instance) //超过两秒没发出元素,则产生error事件
                .subscribe(onNext: { element in
                    print(element)
                }, onError: { error in
                    print(error)
                })
                .disposed(by: disposeBag)
        }
    }
    运行结果如下:
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)

    6,using

    (1)基本介绍
    • 使用 using 操作符创建 Observable 时,同时会创建一个可被清除的资源,一旦 Observable 终止了,那么这个资源就会被清除掉了。
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
    (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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    import UIKit
    import RxSwift
    import RxCocoa
     
    class ViewControllerUIViewController {
         
        override func viewDidLoad() {
             
            //一个无限序列(每隔0.1秒创建一个序列数 )
            let infiniteInterval$ = Observable<Int>
                .interval(0.1, scheduler: MainScheduler.instance)
                .do(
                    onNext: { print("infinite$: ($0)") },
                    onSubscribe: { print("开始订阅 infinite$")},
                    onDispose: { print("销毁 infinite$")}
            )
             
            //一个有限序列(每隔0.5秒创建一个序列数,共创建三个 )
            let limited$ = Observable<Int>
                .interval(0.5, scheduler: MainScheduler.instance)
                .take(2)
                .do(
                    onNext: { print("limited$: ($0)") },
                    onSubscribe: { print("开始订阅 limited$")},
                    onDispose: { print("销毁 limited$")}
            )
             
            //使用using操作符创建序列
            let o: Observable<Int> = Observable.using({ () -> AnyDisposable in
                return AnyDisposable(infiniteInterval$.subscribe())
            }, observableFactory: { _ in return limited$ }
            )
            o.subscribe()
        }
    }
     
    class AnyDisposableDisposable {
        let _dispose: () -> Void
         
        init(_ disposable: Disposable) {
            _dispose = disposable.dispose
        }
         
        func dispose() {
            _dispose()
        }
    }
    运行结果如下:
    原文:Swift - RxSwift的使用详解14(其他操作符:delay、materialize、timeout等)
  • 相关阅读:
    一起来学linux:网络命令
    python网络爬虫之使用scrapy自动登录网站
    python网络爬虫之requests库 二
    一起来学linux:网络配置
    一起来学linux:日志文件
    一起来学linux:进程
    python网络爬虫之requests库
    【原创】大数据基础之Ambari(1)简介、编译安装、使用
    【原创】数据库基础之Mysql(1)常用命令
    【原创】大叔经验分享(22)securecrt连接自动断开
  • 原文地址:https://www.cnblogs.com/strengthen/p/13674956.html
Copyright © 2011-2022 走看看