将多个Observables
组合成单个的Observable
的操作
startWith
在Observable
源发出元素前,发出特定的元素队列。
let disposeBag = DisposeBag()
Observable.of("🐶", "🐱", "🐭", "🐹")
.startWith("1️⃣")
.startWith("2️⃣")
.startWith("3️⃣", "🅰️", "🅱️") //记住这个输出是3开头 你懂的
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
merge (合并)
将源可观察序列的元素组合成一个新的可观察序列,并按照每个源可观察序列发出每个元素。
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("🅰️")
subject1.onNext("🅱️")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("🆎")
subject2.onNext("③")
zip (组合)
将最多达8个源可观察序列合并成一个新的可观察序列,并从组合可观察序列中从对应的源可观察序列中的每个元素发射相应的索引。
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSubject.onNext("🅰️")
stringSubject.onNext("🅱️")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("🆎")
intSubject.onNext(3)
combineLatest (就近取值)
将最多8个源可观察队列合并成单个新的可观察队列,当多个源至少有一个的时候发出。当其他的源多余的开始发出时,其他的都是最近一个。
let disposeBag = DisposeBag()
let stringSubject = PublishSubject<String>()
let intSubject = PublishSubject<Int>()
Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
stringSubject.onNext("🅰️")
stringSubject.onNext("🅱️")
intSubject.onNext(1)
intSubject.onNext(2)
stringSubject.onNext("🆎")
当然可以将数组作为参数
let disposeBag = DisposeBag()
let stringObservable = Observable.just("❤️")
let fruitObservable = Observable.from(["🍎", "🍐", "🍊"])
let animalObservable = Observable.of("🐶", "🐱", "🐭", "🐹")
Observable.combineLatest([stringObservable, fruitObservable, animalObservable]) {
"\($0[0]) \($0[1]) \($0[2])"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
很多人不理解为什么需要这种组合呢?其实我们想一想便知,如果有一个源发出事件,其他的采用最近的状态可以保留以前的状态而不改变,这样组合就比较实用,像多个label,其中一个值改了,没有改的label捕获的值最好保持原数据。
如果你采用zip组合,那必须两个label都有值改变才会触发,显然不便于我们更改label值。
switchLatest
将可观察序列发射的元素转换为可观察序列,并从最近的内部可观察序列中发射元素。
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "⚽️")
let subject2 = BehaviorSubject(value: "🍎")
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) }) // 不会输出RxSwift.BehaviorSubject<Swift.String> 因为已将发出的元素作为序列
.disposed(by: disposeBag)
subject1.onNext("🏈")
subject1.onNext("🏀")
variable.value = subject2
subject1.onNext("⚾️") // 无效
subject2.onNext("🍐")