十、條件和布爾操作符(Conditional and Boolean Operators)
條件和布爾操作會(huì)根據(jù)條件發(fā)射或變換 Observables
,或者對(duì)他們做布爾運(yùn)算。
1,amb
(1)基本介紹
- 當(dāng)傳入多個(gè)
Observables
到amb
操作符時(shí),它將取第一個(gè)發(fā)出元素或產(chǎn)生事件的Observable
,然后只發(fā)出它的元素。并忽略掉其他的Observables
。
(2)使用樣例
let disposeBag = DisposeBag()
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()
let subject3 = PublishSubject<Int>()
subject1
.amb(subject2)
.amb(subject3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject2.onNext(1)
subject1.onNext(20)
subject2.onNext(2)
subject1.onNext(40)
subject3.onNext(0)
subject2.onNext(3)
subject1.onNext(60)
subject3.onNext(0)
subject3.onNext(0)
運(yùn)行結(jié)果如下:
2,takeWhile
(1)基本介紹
- 該方法依次判斷
Observable
序列的每一個(gè)值是否滿足給定的條件。 當(dāng)?shù)谝粋€(gè)不滿足條件的值出現(xiàn)時(shí),它便自動(dòng)完成。
(2)使用樣例
let disposeBag = DisposeBag()
Observable.of(2, 3, 4, 5, 6)
.takeWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
運(yùn)行結(jié)果如下:
3,takeUntil
(1)基本介紹
- 除了訂閱源
Observable
外,通過takeUntil
方法我們還可以監(jiān)視另外一個(gè)Observable
, 即notifier
。 - 如果
notifier
發(fā)出值或complete
通知,那么源Observable
便自動(dòng)完成,停止發(fā)送事件。
(2)使用樣例
let disposeBag = DisposeBag()
let source = PublishSubject<String>()
let notifier = PublishSubject<String>()
source
.takeUntil(notifier)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
source.onNext("a")
source.onNext("b")
source.onNext("c")
source.onNext("d")
//停止接收消息
notifier.onNext("z")
source.onNext("e")
source.onNext("f")
source.onNext("g")
運(yùn)行結(jié)果如下:
4,skipWhile
(1)基本介紹
- 該方法用于跳過前面所有滿足條件的事件。
- 一旦遇到不滿足條件的事件,之后就不會(huì)再跳過了。
(2)使用樣例
let disposeBag = DisposeBag()
Observable.of(2, 3, 4, 5, 6)
.skipWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下:
5,skipUntil
(1)基本介紹
- 同上面的
takeUntil
一樣,skipUntil
除了訂閱源Observable
外,通過skipUntil
方法我們還可以監(jiān)視另外一個(gè)Observable
, 即notifier
。 - 與
takeUntil
相反的是。源Observable
序列事件默認(rèn)會(huì)一直跳過,直到notifier
發(fā)出值或complete
通知。
(2)使用樣例
let disposeBag = DisposeBag()
let source = PublishSubject<Int>()
let notifier = PublishSubject<Int>()
source
.skipUntil(notifier)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
source.onNext(1)
source.onNext(2)
source.onNext(3)
source.onNext(4)
source.onNext(5)
//開始接收消息
notifier.onNext(0)
source.onNext(6)
source.onNext(7)
source.onNext(8)
//仍然接收消息
notifier.onNext(0)
source.onNext(9)
運(yùn)行結(jié)果如下: