過濾和條件操作

從源可觀察序列中選擇性地發射元素的操作。

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("??")  // ??????

算術和集合操作

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容