Skip to content

Files

Latest commit

DKJoneDKJone
and
Dec 15, 2016
7ac12e0 · Dec 15, 2016

History

History
163 lines (121 loc) · 5.25 KB

Combining_Operators.md

File metadata and controls

163 lines (121 loc) · 5.25 KB

上一页 - 返回目录

第三章 组合

操作符可以绑定多个Observable为一个Observable信号。

startWith

发送指定元素的在队列发出之前(在队列最前方插入)。 更多信息

example("startWith") {
    let disposeBag = DisposeBag()
    
    Observable.of("🐶", "🐱", "🐭", "🐹")
        .startWith("1️⃣")
        .startWith("2️⃣")
        .startWith("3️⃣", "🅰️", "🅱️")
        .subscribe(onNext: { print($0) })
        .addDisposableTo(disposeBag)
}

如例所示如,startWidth可以连接成一个后进先出队列,所有继承StartWidth的元素都被添加到之前StartWidth元素之前。


merge

从源头合并多个Observable元素为一个信号队列,并且发送原Observable队列的事件。 更多信息

example("merge") {
   let disposeBag = DisposeBag()
   
   let subject1 = PublishSubject<String>()
   let subject2 = PublishSubject<String>()
   
   Observable.of(subject1, subject2)
       .merge()
       .subscribe(onNext: { print($0) })
       .addDisposableTo(disposeBag)
   
   subject1.onNext("🅰️")
   
   subject1.onNext("🅱️")
   
   subject2.onNext("")
   
   subject2.onNext("")
   
   subject1.onNext("🆎")
   
   subject2.onNext("")
}

zip

绑定最多达8个Observable队列源为一个信号源,并发送按原始队列对应序号绑定后的元素,直到每个原始队列在该序号上都有元素。 更多信息

example("zip") {
   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)
   
   stringSubject.onNext("🅰️")
   stringSubject.onNext("🅱️")
   
   intSubject.onNext(1)
   
   intSubject.onNext(2)
   
   stringSubject.onNext("🆎")
   intSubject.onNext(3)
}

combineLatest

绑定最多达8个Observable队列为一个新的信号队列,并绑定每个原始队列的最新的一个元素在一起为一个信号,在每个原始队列添加元素师都会发送一个新的绑定元素。 更多信息

example("combineLatest") {
   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)
   
   stringSubject.onNext("🅰️")
   
   stringSubject.onNext("🅱️")
   intSubject.onNext(1)
   
   intSubject.onNext(2)
   
   stringSubject.onNext("🆎")
}

There is also a combineLatest extension on Array:

example("Array.combineLatest") {
    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) })
        .addDisposableTo(disposeBag)
}

基于数组的扩展要求原队列元素类型相同。元素按原队列序号依次添加111222333....


switchLatest

转换Observable队列发送的元素,并发送内部队列里最近的值。 更多信息

example("switchLatest") {
   let disposeBag = DisposeBag()
   
   let subject1 = BehaviorSubject(value: "⚽️")
   let subject2 = BehaviorSubject(value: "🍎")
   
   let variable = Variable(subject1)
       
   variable.asObservable()
       .switchLatest()
       .subscribe(onNext: { print($0) })
       .addDisposableTo(disposeBag)
   
   subject1.onNext("🏈")
   subject1.onNext("🏀")
   
   variable.value = subject2
   
   subject1.onNext("⚾️")
   
   subject2.onNext("🍐")
}

在这个例子中,在设置variable.value=subject2后添加⚾️到subject1不会产生任何影响,因为只有最近的内部Observable队列subject2才会发送元素。

下一章 - 返回目录