RxSwift - 알아보기Operator<Filtering>

JSLee·2022년 2월 17일
0

Observable의 item을 선택적으로 방출(emit)하는 operator.

element(at:)

일단 함수의 이름이 살짝 변경된것 같습니다.
iOS 15 로 개발하게 되면 ElementAt 을 사용할수 없고 element(at:) 으로 사용하라는 알림이 있습니다.

element(at:) 은 count 로 인식하고 방출하지 않고 지정된 값을 index 로 인식하여 방출합니다.

element 사용 예시를 조금 알아 보면
PublishSubject

    let sub = PublishSubject<String>()
        sub.element(at: 2).subscribe {
            print($0)
        }.disposed(by: disposeBag)
        sub.onNext("하이")
        sub.onNext("바이")
        sub.onNext("키키")
        //print
        //onNext("키키")

PublishSubject를 subscribe 이후 값에 변화를 감시합니다. 그리고 설정된 index에 맞는 요소를 방출합니다
PublishSubject 는 subscribes 한 시점 이후 부터 발생하는 Event 만 방출합니다.

또 다른 방법으로 Observable 생성 operator 를 사용한 예시 코드입니다.

From

        Observable<Int>.from([1,2,3,4,5]).element(at: 4).subscribe {
            print($0)
        }.disposed(by: disposeBag)
        
        //print
        // next(5)

from 으로 생성된 observable 의 4번 index 의 값만 emit 합니다.


IgnoreElements

사진에서 볼수 있듯 IgnoreElements 는 element 들을 방출하지 않습니다.
즉 onNext emit event 가 존재하지 않습니다
이그노어 엘리멘츠는 completed , error event 만 emit 합니다.

Observable<Int>.from([1,2,3,4,5]).ignoreElements().subscribe {
            print($0)
        }.disposed(by: disposeBag)
        //print 
        //completed

성공여부,오류 만을 판단하기 위한 operator 입니다.

  Observable<Int>.from([1,2,3,4,5]).ignoreElements().element(at: 2).subscribe {
            print($0)
        }.disposed(by: disposeBag)
        //print 
        //error(Argument out of range.)
        
        
   Observable<Int>.from([1,2,3,4,5]).element(at: 2).ignoreElements().subscribe {
            print($0)
        }.disposed(by: disposeBag)
        //print
        //completed

Filter

filter 는 방출할 요소에 대한 조건이 필요하다.

    Observable<Int>.from([1,2,3,4,5])
        .filter { $0 > 3 }
        .subscribe { print($0)}
        .disposed(by: disposeBag)
        
        //print
        //onNext(4)
        //onNext(5)
        //completed

Skip

element 와 비슷한 Operator 선택한 count 까지의 시퀀스 들 을 무시하고 그 이후 요소만 방출한다.

        Observable<String>.from(["a","b","c","d","e","f"])
            .skip(3)
            .subscribe(onNext: {
                print($0)
            })
            .disposed(by: disposeBag)
            //print
            //d
            //e
            //f

Skip(while:)



skip(while:) 은 해당 조건에 만족되는 요소들을 skip 한다.
하지만 최초 값이 만약 조건에 만족되지 못하면 skip 없이 모든 요소들을 방출한다.
또한 skip 진행중 조건에 만족되지 못하는 요소가 나오면 그뒤에 조건이 만족되는 요소가 존재한다고 해도 모두 방출한다.

        Observable.of(1,1,1,1,1,3,3,3,3,1,4,5,1,2,3)
            .skip(while: { $0 == 1 })
            .subscribe(onNext: {
                print($0)
            })
            .disposed(by: disposeBag)
 //print
3
3
3
3
1
4
5
1
2
3

subscribe 하는 동안 요소를 필터링 하는 Filter 와 다르게 SkipWhile 은 조건이 false 로 평가될 때 까지만 건너뛰고 그 뒤에 오는 모든 요소는 방출합니다.


Skip(untill: )

skip(until:_)
Event 를 Emit 하는 Observable(A) 과 Trigger 목적으로 사용되는 Observable(B)
두개의 Observable 사이 관계에서 A 는 B 와 연결되기 전까지의 Event를 무시합니다.
이후 B 에서 Emit 이 일어나면 A는 Event 를 Emit 하기 시작합니다.

        let sub = PublishSubject<String>()
        let trg = PublishSubject<String>()
        sub
            .skip(until: trg)
            .subscribe(onNext: {
                print($0)
            }).disposed(by: disposeBag)
        
        sub.onNext("가")
        sub.onNext("나")
        trg.onNext("다")
        sub.onNext("라")
        sub.onNext("마")

sub 에 skip을 사용하고 인자로 trg 를 보냅니다.
이렇게 되면 sub 는 trg를 감시 하고 있고
trg가 시퀀스를 방출 하기 전까지 sub 는 시퀀스를 방출하지 않습니다.

그이후 trg가 시퀀스를 방출하게 되고 그럼 sub는 trg 방출 이후에 발생하는 시퀀스를 방출합니다

        sub.onNext("가")
        sub.onNext("나")
        trg.onNext("다")
        sub.onNext("라")
        sub.onNext("마")
        sub.onNext("바")
        trg.onNext("사")
        sub.onNext("아")
/*
print
라
마
바
아
*/

trigger 의 Emit 이 여러번 일어나게 되도 실질적인 Event 를 Emit 하는 Observable 은 Trigger 의 최신값을 감시 하지 않고 첫번째의 Trigger의 처음 Emit 을 추적하게 됩니다.

First(Single)

가장 첫번째 발생하는 Event 만 Emit 합니다.

RxSwift 에서는 첫번째 Event만 Emit 하려는 경우

Take(1) ElementAt(0) 이러한 작업을 하지말고 사용하라고 권장 하고 있습니다.

First 사용시 유의 할 점

Emit 되는 Event 들은 Single 의 타입을 가지고 있습니다.

그래서 completed , error 에 대한 핸들링이 불가능합니다.

 Observable.from([1,2,3,4,5])
            .first()
            .subscribe { single in
                print(single)
            }.disposed(by: disposeBag)
        
        Observable.from([1,2,3,4,5])
            .asSingle()
            .subscribe { single  in
                print(single)
            }.disposed(by: disposeBag)

Output은 Optional 출력된다.

Last

가장 마지막 발생하는 Event 만 Emit 합니다.
RxSwift 에서는 TakeLast(1) 같은 작업을 하지말고 사용하라고 권장 하고 있습니다.

Sample

주기적인 시간 간격 내에서 Observable에 의해 방출된 가장 최근 항목을 방출합니다.

Observable을 주기적으로 살펴보고 샘플링 이후 가장 최근에 방출한 항목을 방출합니다.

withLatestFrom Operator 와 흡사 하지만
Sample 은 Trigger Observable 을 매개 변수로 사용합니다.

Trigger Observable 이 종료되면 subscribe Observabl의 가장 최근 요소가 방출 됩니다.

profile
iOS/Android/FE/BE

0개의 댓글