從源可觀察序列中選擇性地發射元素的操作。
filter
僅從符合指定條件的可觀察序列中發出這些元素。
let disposeBag = DisposeBag()
Observable.of(
"??", "??", "??",
"??", "??", "??",
"??", "??", "??")
.filter {
$0 == "??"
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
distinctUntilChanged
抑制可觀察序列發出的序列重復元素。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??", "??")
.distinctUntilChanged()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) //??????????
elementAt
僅在可觀察序列中發出的所有元素的指定索引中釋放元素。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.elementAt(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // ??
single
只發出可觀察序列發出的第一個元素(或滿足條件的第一個元素)。如果可觀察序列不是恰好發射一個元素,(多個滿足條件的)則拋出一個錯誤。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
加條件
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag) // next(??) completed
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag) // next(??) error(Sequence contains more than one element.)
Observable.of("??", "??", "??", "??", "??", "??")
.single { $0 == "??" }
.subscribe { print($0) }
.disposed(by: disposeBag) // error(Sequence doesn't contain any elements.)
take
僅從可觀察序列的開頭發出指定數量的元素
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.take(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // ??????
takeLast
僅從可觀察序列的結尾發出指定數量的元素。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.takeLast(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // ??????
takeWhile
只要指定的條件求值為true,則從可觀察序列的開頭發出元素。
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.takeWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // 1 2 3
takeUntil
從源可觀察序列中釋放元素,直到引用可觀察序列發出元素結束(發照發,有人來了就不發了)
let disposeBag = DisposeBag()
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()
sourceSequence
.takeUntil(referenceSequence)
.subscribe { print($0) }
.disposed(by: disposeBag)
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
referenceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??") // next(??) next(??) next(??) completed
skip
禁止從可觀察序列的開頭釋放指定數量的元素。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.skip(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // ????????
shipWhile
禁止從符合指定條件的可觀察序列的開頭發出元素。
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.skipWhile { $0 < 4 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // 4 5 6
skipWhileWithIndex
禁止從符合指定條件的可觀察序列的開頭發出元素,并發出剩余的元素。閉包可用通過每個元素的索引。
let disposeBag = DisposeBag()
Observable.of("??", "??", "??", "??", "??", "??")
.skipWhileWithIndex { element, index in
index < 3
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // ??????
skipUntil
禁止從源可觀察序列中釋放元素,直到引用可觀察序列發出元素。
let disposeBag = DisposeBag()
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()
sourceSequence
.skipUntil(referenceSequence)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
referenceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??")
sourceSequence.onNext("??") // ??????