为有牺牲多壮志,敢教日月换新天。

[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等)
posted @ 2020-09-15 16:09  为敢技术  阅读(843)  评论(0编辑  收藏  举报