[iOS | RxSwift] Filtering Operator

minji0801·2022년 1월 24일
0

RxSwift

목록 보기
5/6
post-thumbnail

개요

RxSwift가 무엇인지부터 시작해서 지금까지 Observable에 대해서 알아보았다.
이번에는 Operator 중에서도 Filtering Operator에 대해서 알아볼 것이다.


Filtering Operator

Next 이벤트를 통해 받아온 값을 필터링할 수 있는 연산자이다. Array의 filter와 거의 동일한 역할을 한다. 그럼 직접 코드를 작성하며 알아보자.

  • ignoreElements()
    ignoreElements()는 Next 이벤트를 무시하는 연산자이다. 즉, Completed와 Error 이벤트만 방출시킨다.
let dispoaseBag = DisposeBag()
let 방해금지 = PublishSubject<String>()

방해금지
    .ignoreElements()
    .subscribe { _ in
        print("🌙")
    }
    .disposed(by: dispoaseBag)

방해금지.onNext("카톡알림")
방해금지.onNext("카톡알림")
방해금지.onNext("전화")

방해금지.onCompleted()

// print
// 🌙
  • element(at:)
    element(at:)는 Next 이벤트에서 해당하는 인덱스의 값만 필터링하여 방출한다.
let filtering = PublishSubject<String>()

filtering
    .element(at: 2)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)

filtering.onNext("0")   // index0
filtering.onNext("1")   // index1
filtering.onNext("2")   // index2
filtering.onNext("3")   // index3

// print
// 2
  • filter
    필터링해야 하는 값이 한 가지 이상일 때 filter 클로저 구문 내 요청사항을 통해 해당 값을 필터링한다.
Observable.of(1,2,3,4,5,6,7,8)
    .filter { $0 % 2 == 0 }
    .subscribe (onNext:{
        print($0)
    })
    .disposed(by: dispoaseBag)

// print
// 2
// 4
// 6
// 8
  • skip
    skip은 해당 값만큼 건너뛰는 것이다.
    아래 예제에서 skip(5)는 5개의 값을 건너뛰라는 것이다. 따라서, 6이 방출된 것을 확인할 수 있다.
Observable.of(1,2,3,4,5,6)
    .skip(5)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)
    
// print
// 6
  • skipWhile
    skipWhile은 조건에 해당할 때까지 건너띄는 것이다.
    아래 예제에서 skipWhile 문의 조건이 $0 != 6이므로 값이 6이 아닐 때까지는 건너띄다가 6인 이후부터는 방출한 것이다.
Observable.of(1,2,3,4,5,6,7,8)
    .skip(while: {
        $0 != 6
    })
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)
    
// print
// 6
// 7
// 8
  • skipUntil
    skipUntil은 조건에 해당하는 또 다른 Observable가 Next 이벤트를 방출하기 전까지는 현재 Observable의 Next 이벤트를 무시하는 것이다.
let person = PublishSubject<String>()
let open = PublishSubject<String>()

person
    .skip(until: open)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)

person.onNext("1")
person.onNext("2")
open.onNext("Open the Door!")
person.onNext("3")

// print
// 3
  • take
    take는 skip의 반대로, 해당 값만큼 가져오는 것이다.
    아래 예제에서 take(3)은 앞에서부터 3개의 값을 가져오라는 것이다.
Observable.of(1,2,3,4,5)
    .take(3)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)

// print
// 1
// 2
// 3
  • takeWhile
    takeWhile은 조건에 해당될 때까지 값을 가져오는 것이다.
    아래 예제에서 takeWhile 문의 조건이 $0 != 3이므로 값이 3이 아닐 때까지 값을 가져온 것이다.
Observable.of(1,2,3,4,5)
    .take(while: {
        $0 != 3
    })
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)
    
// print
// 1
// 2
  • enumerated
    enumerated는 takeWhile과 함께 쓰이며, element 값과 더불어 index 값도 가져온다.
    enumerated는 방출된 요소의 인덱스를 참고할 때 사용하면 좋다.
Observable.of(1,2,3,4,5)
    .enumerated()
    .takeWhile {
        $0.index < 3
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)

// print
// (index: 0, element: 1)
// (index: 1, element: 2)
// (index: 2, element: 3)
  • takeUntil
    takeUntil은 skipUntil의 반대로, 또 다른 Observablerk Next 이벤트를 방출하기 전까지 현재 Observable의 Next 이벤트를 방출하는 것이다.
let student = PublishSubject<String>()
let close = PublishSubject<String>()

student
    .take(until: close)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)

student.onNext("1")
student.onNext("2")
close.onNext("Close!")
student.onNext("3")

// print
// 1
// 2
  • distinctUntilChanged
    distinctUntilChanged는 연속적으로 반복되는 요소를 무시하는 것이다.
    아래 예제에서 연속적으로 반복된 하트는 모두 한 번만 방출되었다.
    중간에 또 나온 빨간 하트는 앞에 빨간 하트와 겹치지만 연속적이지 않기 때문에 방출된 것이다.
Observable.of("❤️","❤️","💛","💛","💛","💛","💙","💙","💙","❤️","💜","💜")
    .distinctUntilChanged()
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: dispoaseBag)
    
// print
// ❤️
// 💛
// 💙
// ❤️
// 💜

마무리

이렇게 다양한 Filtering Operator 연산자들을 알아보았다.
아마 실제 구현할 때 이 연산자들을 잘 사용해서 더 간결하고 효율적인 코드를 작성할 수 있지 않을까 싶다.
다음에는 Transforming Operator에 대해서 알아보자.

profile
iOS Developer

0개의 댓글