组合操作

将多个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("🍐")

转换操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容