Skip to content

Filtering Operator #76

Closed
Closed
@Youngminah

Description

ignoreElements

image

  • next이벤트를 무시한다.
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()

strikes
    .ignoreElements()
    .subscribe({ _ in
        print("You're out!")
    })      
   .disposed(by: disposeBag)

strikes.onNext("X")
strikes.onNext("X")
strikes.onNext("X")
     
strikes.onCompleted() //이건만 출력됨 
  • onCompleted 때문에 You're out! 하나 출력

elementAt

image

  • 배열 인덱스 처리처럼 방출된 n번째 요소만 사용하고자 할 때 사용 ( 0부터 시작)
 let strikes = PublishSubject<String>()
 let disposeBag = DisposeBag()

 strikes
    .elementAt(2)
    .subscribe(onNext: { 
        print($0)
    })
    .disposed(by: disposeBag)
     
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")
// 3 출력
  • 2를 넣었으니 3번째 값 방출

filter

  • 참인 값만 방출하게 함.
  • 조건문 등을 활용할 수 있음
    image
let disposeBag = DisposeBag()

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

// 2 
// 4
// 6 방출
  • 필터링 요구사항이 한 가지 이상일 때 사용

skip

  • 첫 번째 요소부터 n개의 요소를 skip
  • 주의 ❗️ 인덱스 개념이 아님 갯수 개념임 따라서 1부터 시작!
    image
let disposeBag = DisposeBag()
     
Observable.of("A", "B", "C", "D", "E", "F")
    .skip(3)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// D,E,F만 출력됨

skipWhile

  • 어떤 요소를 skip하지 않을 때까지 skip하고 종료하는 연산자
  • 즉 조건문이 처음으로 거짓으로 나온 이후부터는 모두 방출
    image
let disposeBag = DisposeBag()
     
Observable.of(2, 2, 3, 4, 4)
    .skipWhile { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// 3, 4, 4 만 출력됨

skipUntil

  • 다른 observable이 시동할 때까지 현재 observable에서 방출하는 이벤트를 skip
  • 다른 observable이 .next이벤트를 방출하기 전까지는 기존 observable에서 방출하는 이벤트들을 무시하는 것
    image
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("X")
subject.onNext("C")
// C만 출력됨
  • skipUntil(옵져버블타입) 이러한 형태로 옵져버블타입이 들어간다.
  • 또는 skip(until: 옵져버블타입)

take

  • 어떤 n개까지 요소를 취하고 싶을 때 사용할 수 있는 연산자
  • until 과 반대되는 개념
    image
let disposeBag = DisposeBag()
     
Observable.of(1,2,3,4,5,6)
    .take(3)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// 1, 2, 3 만 출력됨

takeWhile

  • 조건문에서 true에 해당하는 값을 방출
  • 처음으로 false가 나온뒤 이후에 true가 나오더라도 방출 안함 (skipWhile과 반대)
    image
let disposeBag = DisposeBag()
     
Observable.of(2, 2, 3, 4, 4)
    .takeWhile { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// 2, 2 만 출력됨

enumerated

  • 방출된 요소의 index를 참고하고 싶은 경우가 있을 때, 사용
  • 기존 Swift의 enumerated 메소드와 유사하게, Observable에서 나오는 각 요소의 index와 값을 포함하는 튜플을 생성
  • 클로져에서 index로 접근 할 수 있다.
let disposeBag = DisposeBag()
     
Observable.of(2,2,4,4,6,6)
    .enumerated()
    .takeWhile { $0.index < 3 }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// (index: 0, element: 2)
// (index: 1, element: 2)
// (index: 2, element: 4) 출력

Observable.of(2,2,4,4,6,6)
    .enumerated()
    .takeWhile({ index, value in
        value % 2 == 0 && index < 3
    })
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// 2, 2, 4 출력
  • 위의 예시 둘 처럼 사용 가능하다 참고!

takeUntil

  • trigger가 되는 Observable이 구독되기 전까지의 이벤트값만 받는 것
  • whileUntil과 반대
    image
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("X")
subject.onNext("3")
// 1, 2만 출력됨

distinctUntilChanged

  • 중복해서 이어지는 값을 막아주는 연산자
    image

그림에서처럼 distinctUntilChanged는 연달아 같은 값이 이어질 때 중복된 값을 막아주는 역할을 한다.
2는 연달아 두 번 반복되었으므로 뒤에 나온 2가 배출되지 않았다.
1은 중복이긴 하지만 연달아 반복된 것이 아니므로 그대로 배출된다.

let disposeBag = DisposeBag()
     
Observable.of("A", "A", "B", "B", "A")
     .distinctUntilChanged()
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
// A, B, A 출력
  • 연달아만 아니면 된다.

distinctUntilChanged(_:)

  • distinctUntilChanged는 기본적으로 구현된 로직에 따라 같음
  • 커스텀한 비교로직을 구현하고 싶을 때 사용

image

  • 그림처럼 클로져를 통해 비교가 가능 한 것.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions