-
startWith
该方法会在 Observable 序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息
Observable.of("3", "4")
.startWith("1", "2")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
// 这样也能添加多个元素
Observable.of("3", "4")
.startWith("1")
.startWith("2") // 后加入的会在前面
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
-
merge
该方法可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列
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)
-
zip
该方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列,而且它必须等到每个 Observable 事件一一对应地凑齐之后再合并
Observable.zip(subject1, subject2) { (num, str) -> String in
return "\(num)" + str
}
.observeOn(MainScheduler.instance) // 加这个是为了回到主线程执行
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
附:zip 常常用在整合网络请求上。
比如我们想同时发送两个请求,只有当两个请求都成功后,再将两者的结果整合起来继续往下处理。这个功能就可以通过 zip 来实现
-
combineLatest
该方法同样是将多个(两个或两个以上的)Observable 序列元素进行合并,但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并,即会把多个Observable的最新的值进行合并
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")
-
withLatestFrom
该方法将两个 Observable 序列合并为一个。每当主队列发射一个元素时,便从第二个序列中取出最新的一个值
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
subject1.withLatestFrom(subject2)
.subscribe(onNext: { print($0) // 打印subject2的内容 })
.disposed(by: disposeBag)
subject1.onNext("A")
subject2.onNext("1")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("2")
subject1.onNext("D")
-
switchLatest
switchLatest 有点像其他语言的 switch 方法,可以对事件流进行转换
比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2
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")