zoukankan      html  css  js  c++  java
  • [RxSwift教程]11、结合操作符:startWith、merge、zip等

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

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

    十一、结合操作(Combining Observables)

    结合操作(或者称合并操作)指的是将多个 Observable 序列进行组合,拼装成一个新的 Observable 序列。
     

    1,startWith

    (1)基本介绍
    • 该方法会在 Observable 序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息。
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    let disposeBag = DisposeBag()
             
    Observable.of("2""3")
        .startWith("1")
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    运行结果如下:

    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (3)当然插入多个数据也是可以的
    1
    2
    3
    4
    5
    6
    7
    8
    let disposeBag = DisposeBag()
     
    Observable.of("2""3")
        .startWith("a")
        .startWith("b")
        .startWith("c")
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    运行结果如下:

    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)

    2,merge

    (1)基本介绍
    • 该方法可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列。
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    let disposeBag = DisposeBag()
             
    let subject1 = PublishSubject<Int>()
    let subject2 = PublishSubject<Int>()
     
    Observable.of(subject1, subject2)
        .merge()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    subject1.onNext(20)
    subject1.onNext(40)
    subject1.onNext(60)
    subject2.onNext(1)
    subject1.onNext(80)
    subject1.onNext(100)
    subject2.onNext(1)
    运行结果如下:
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)

    3,zip

    (1)基本介绍
    • 该方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列。
    • 而且它会等到每个 Observable 事件一一对应地凑齐之后再合并。
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let disposeBag = DisposeBag()
             
    let subject1 = PublishSubject<Int>()
    let subject2 = PublishSubject<String>()
     
    Observable.zip(subject1, subject2) {
        "($0)($1)"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    subject1.onNext(1)
    subject2.onNext("A")
    subject1.onNext(2)
    subject2.onNext("B")
    subject2.onNext("C")
    subject2.onNext("D")
    subject1.onNext(3)
    subject1.onNext(4)
    subject1.onNext(5)
    运行结果如下:
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    附:zip 常常用在整合网络请求上。
    比如我们想同时发送两个请求,只有当两个请求都成功后,再将两者的结果整合起来继续往下处理。这个功能就可以通过 zip 来实现。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //第一个请求
    let userRequest: Observable<User> = API.getUser("me")
     
    //第二个请求
    let friendsRequest: Observable<Friends> = API.getFriends("me")
     
    //将两个请求合并处理
    Observable.zip(userRequest, friendsRequest) {
            user, friends in
            //将两个信号合并成一个信号,并压缩成一个元组返回(两个信号均成功)
            return (user, friends)
        }
        .observeOn(MainScheduler.instance) //加这个是应为请求在后台线程,下面的绑定在前台线程。
        .subscribe(onNext: { (user, friends) in
            //将数据绑定到界面上
            //.......
        })
        .disposed(by: disposeBag)

    4,combineLatest

    (1)基本介绍
    • 该方法同样是将多个(两个或两个以上的)Observable 序列元素进行合并。
    • 但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并。
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let disposeBag = DisposeBag()
             
    let subject1 = PublishSubject<Int>()
    let subject2 = PublishSubject<String>()
     
    Observable.combineLatest(subject1, subject2) {
        "($0)($1)"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    subject1.onNext(1)
    subject2.onNext("A")
    subject1.onNext(2)
    subject2.onNext("B")
    subject2.onNext("C")
    subject2.onNext("D")
    subject1.onNext(3)
    subject1.onNext(4)
    subject1.onNext(5)
    运行结果如下:
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)

    5,withLatestFrom

    (1)基本介绍
    • 该方法将两个 Observable 序列合并为一个。每当 self 队列发射一个元素时,便从第二个序列中取出最新的一个值。
     
    (2)使用样例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let disposeBag = DisposeBag()
     
    let subject1 = PublishSubject<String>()
    let subject2 = PublishSubject<String>()
     
    subject1.withLatestFrom(subject2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    subject1.onNext("A")
    subject2.onNext("1")
    subject1.onNext("B")
    subject1.onNext("C")
    subject2.onNext("2")
    subject1.onNext("D")

    运行结果如下:

    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)

    6,switchLatest

    (1)基本介绍
    • switchLatest 有点像其他语言的 switch 方法,可以对事件流进行转换。
    • 比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2。
    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
    (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
    let disposeBag = DisposeBag()
     
    let subject1 = BehaviorSubject(value: "A")
    let subject2 = BehaviorSubject(value: "1")
     
    let variable = Variable(subject1)
     
    variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
     
    subject1.onNext("B")
    subject1.onNext("C")
     
    //改变事件源
    variable.value = subject2
    subject1.onNext("D")
    subject2.onNext("2")
     
    //改变事件源
    variable.value = subject1
    subject2.onNext("3")
    subject1.onNext("E")

    运行结果如下:

    原文:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)
  • 相关阅读:
    JS注意事项
    正则
    js闭包
    【转】chrome console用法
    JSON
    流式传输原理(一) 之通过Web服务器访问音频和视频
    流式传输原理(二) 之通过流式服务器访问音视频
    Equivalence Class Partitioning等价类划分黑盒测试
    【判断闰年】程序抛出异常的解决方案
    新学期😄😄😄
  • 原文地址:https://www.cnblogs.com/strengthen/p/13673665.html
Copyright © 2011-2022 走看看