几种常见的操作符
联合操作
联合操作就是把多个Observable流合成单个Observable流
merge
合并两个Observable流合成单个Observable流,根据时间轴发出对应的事件
// 2.merge 合并两个Observable流合成单个Observable流,根据时间轴发出对应的事件
func merge() {
print("\n merge test---")
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.of(subject1,subject2).merge().subscribe(onNext:{print($0)}).addDisposableTo(disposeBag)
subject1.onNext("A")
subject1.onNext("B")
subject2.onNext("1")
subject2.onNext("2")
subject1.onNext("AB")
subject2.onNext("3")
}
merge test---
A
B
1
2
AB
3
zip
绑定超过最多不超过8个的Observable流,结合在一起处理。注意Zip是一个事件对应另一个流一个事件。
// 4.zip
func zip() {
print("\n zip test---")
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement,intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
// A1 B2 AB3 ABC4
stringSubject.onNext("A")
stringSubject.onNext("B")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("AB")
intSubject.onNext(3)
intSubject.onNext(4)
stringSubject.onNext("ABC")
}
zip test---
A 1
B 2
AB 3
ABC 4
combineLatest
绑定超过最多不超过8个的Observable流,结合在一起处理。和Zip不同的是combineLatest是一个流的事件对应另一个流的最新的事件,两个事件都会是最新的事件。
// 3.combineLatest
func combineLatest() {
print("\n combineLatest test---")
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.combineLatest(stringSubject, intSubject) { stringElement,intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
// B1 B2 AB2 AB3
stringSubject.onNext("A")
stringSubject.onNext("B")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("AB")
intSubject.onNext(3)
}
zip test---
A 1
B 2
AB 3
ABC 4
switchLatest
switchLatest可以对事件流进行转换,本来监听的subject1,我可以通过更改variable里面的value更换事件源。变成监听subject2。
// 5.switchLatest 可以对事件流进行转换,
// 本来监听的subject1,我可以通过更改variable里面的value更换事件源。变成监听subject2了
func switchLatest() {
print("\n switchLatest test---")
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "B")
// 监听的subject1
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
subject1.onNext("A1")
subject1.onNext("A2")
// 监听对象变为 subject2
variable.value = subject2
subject1.onNext("A3")
subject2.onNext("B1")
// 监听对象变为 subject1
variable.value = subject1
subject2.onNext("B2")
subject1.onNext("A4")
}
switchLatest test---
A
A1
A2
B
B1
A3
A4
变换操作
map
通过传入一个函数闭包把原来的sequence转变为一个新的sequence的操作。
func map() {
print("\n map test---")
let disposeBag = DisposeBag()
Observable.of(1,2,3)
.map { $0 * $0 }
.subscribe(onNext:{ print($0) })
.addDisposableTo(disposeBag)
}
map test---
1
4
9
flatMap
将一个sequence转换为一个sequences,当你接收一个sequence的事件,你还想接收其他sequence发出的事件的话可以使用flatMap,她会将每一个sequence事件进行处理以后,然后再以一个新的sequence形式发出事件。
// 2.flatMap
func flatMap() {
print("\n flatMap test---")
let disposeBag = DisposeBag()
struct Player {
var score:Variable<Int>
}
let subject1 = Player(score: Variable(80))
let subject2 = Player(score: Variable(90))
let variable = Variable(subject1)
variable.asObservable()
.flatMap({$0.score.asObservable()})
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
subject1.score.value = 85
// 监听对象变为 subject2
variable.value = subject2 //更换了value,相当于又添加了一个sequence,两个sequence都可以接收
subject1.score.value = 95
subject2.score.value = 100
}
flatMap test---
80
85
90
95
100
flatMapLatest
flatMapLatest同flatMap一样,也是将一个序列转换为另一个序列,flatMapLatest只会从最近的序列中发出事件,先前建立的Observable将不再被监听。
// 3.flatMapLatest = map + switchLatest
func flatMapLatest() {
print("\n flatMapLatest test---")
let disposeBag = DisposeBag()
struct Player {
var score:Variable<Int>
}
let subject1 = Player(score: Variable(80))
let subject2 = Player(score: Variable(90))
let variable = Variable(subject1)
variable.asObservable()
.flatMapLatest({$0.score.asObservable()})
.subscribe(onNext: {print($0)})
.addDisposableTo(disposeBag)
subject1.score.value = 85
subject1.score.value = 88
// 监听对象变为 subject2
variable.value = subject2 // 更换了value,相当于新增了一个sequence,但只有最新的sequence才能被订阅
subject1.score.value = 95
subject1.score.value = 99
subject2.score.value = 100
}
flatMapLatest test---
80
85
88
90
100
具体的不同,请移步这里《烧脑的map与flatmap》!