iOS/RxSwift

[RxSwift] Filtering Operator

Chafle 2022. 10. 27. 17:35
반응형

필터링 연산자 종류에는

 

 

Ignore

Element At

Filter

Skip

SkipWhile

SkipUntil

Take

TakeWhile

TakeUntil

이 있는데 하나씩 예제를 들어가며 살펴보자

 

 

 

Ignore

 

 

1-2-3의 sequence에서

ignoireElements()를 사용하면 next는 무시된다.

 

단, Oncompleted나 , error등의 event에는 trigger가 된다.

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()

strikes.ignoreElements().subscribe { _ in
    print("[Subscription is called]")
}.disposed(by: disposeBag)

strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C")

이상태로 코드 진행하면 호출되는 것이 없다.

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()

strikes.ignoreElements().subscribe { _ in
    print("[Subscription is called]")
}.disposed(by: disposeBag)

strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C")

strikes.onCompleted()

 

onCompleted()에 호출된 것을 알 수 있다.

 

 


 

ElementAt

 

elementAt(indexnumber)로 인덱스에서 나온 것을 제외하고는 모두 무시한다.

 

 

let strikes = PublishSubject<String>()
let disposebag = DisposeBag()

strikes.elementAt(2) // indexnumber
    .subscribe(onNext: { _ in print("U are fired")
    }).disposed(by: disposeBag)

strikes.onNext("A") // indexnumber0
strikes.onNext("B") // indexnumber1
strikes.onNext("X") // indexnumber2
strikes.onNext("Y") // indexnumber3
strikes.onNext("C") // indexnumber4

 

indexnumber2를 제외하고는 모두 무시된 것을 알 수 있다.

 

 

 


Filter

 

1-2-3-4-5 sequence가 있다면,

 

filter { $0 < 5 }로 필터링하게 되면

1,2,3,4의 sequence값을 얻을 수 있다.

 

 

let strikes = PublishSubject<String>()
let disposebag = DisposeBag()

Observable.of(0,1,2,3,4,5,6,7)
    .filter { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposebag)

 

 


 

Skip

1-2-3의 sequence가 있을 때

 

skip(2)를 이용하면

indexnumber1,2를 건너 뛰고

3의 sequence를 얻을 수 있다.

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()


Observable.of("A","B","C","D","E","F")
    .skip(3)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

 

 

반응형

 

SkipWhile

 

 

조건이 만족할 때까지는 skip을 하고 조건이 깨지는 순간부터 subscribe한다.

 

1-2-3-4 sequence가 있을 때

skipWhile { $0 % 2 ==1 }

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()

Observable.of(2,2,3,4,4,5,6)
    .skipWhile {  $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

 

 


SkipUntil

 

1-2-3 sequence가 있다고 가정할 때

 

trigger가 될 때까지는 skip하고 trigger 이후의 값을 subscribe한다.

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()


let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

subject.skipUntil(trigger)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

subject.onNext("A")
subject.onNext("B")

trigger.onNext("C")
subject.onNext("D")
subject.onNext("E")

A,B까지는 출력이 안되고

C가 트리거 되고 난 이후의 값인 D,E값이 출력됨을 알 수 있다.

 

 

 

 

 


 

Take

 

1-2-3 sequence가 있다고 가정할 때 take(2)로 하면 인자로 받은 수 만큼 subscribe하고  나머지는 무시한다.

(skip과 반대되는 개념)

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()

Observable.of(1,2,3,4,5,6,7)
    .take(3)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

 

 

 

3개만 취하고 나머지는 무시한다.

 

 


TakeWhile

 

조건에 맞을 때 까지 취하고 조건이 깨지면 버린다.

skipwhile과 반대되는 개념

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()


Observable.of(2,4,6,7,8,10)
    .takeWhile{
        $0 % 2 == 0
    }.subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

 

조건에 맞는 2,4,6만 출력하고 깨진 뒤로는 무시한 것을 알 수 있다.

 


Take Until

 

trigger되기 전까지 구독하고 나머지는 무시한다.

skipUntil과 반대되는 개념

 

 

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()

let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

subject.takeUntil(trigger)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

subject.onNext("1")
subject.onNext("2")
trigger.onNext("3")
subject.onNext("4")
subject.onNext("5")
subject.onNext("6")

 

 

 

반응형