본문 바로가기
iOS/RxSwift

[RxSwift] Observable 필터링 연산자 정리

by 6cess 2025. 2. 1.

1. debounce

  • 짧은 시간 동안 새로운 이벤트가 발생하면 이전 이벤트들을 무시하고 마지막 이벤트만 방출
let subject = PublishSubject<String>()

subject
    .debounce(.seconds(1), scheduler: MainScheduler.instance)
    .subscribe(onNext: {
        print("Debounced: \($0)")
    })
    .disposed(by: disposeBag)

subject.onNext("A")
subject.onNext("B")
subject.onNext("C") // 1초 후 "C"만 출력됨

2. distinctUntilChanged

  • 연속된 중복 데이터를 필터링
Observable.of("A", "B", "A", "C", "B", "D", "A")
    .distinct()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

// A
// B
// C
// D

3. elementAt

  • 특정 인덱스에 해당하는 값만 방출
Observable.of("A", "B", "C", "D")
  .element(at: 2)
  .subscribe(onNext: { print($0) })
  .disposed(by: disposeBag)

4. filter

  • true 값을 반환하는 조건만 방출
Observable.of(1, 2, 3, 4, 5)
  .filter { $0 % 2 == 0 }
  .subscribe(onNext: { print($0) })
  .disposed(by: disposeBag)


// 2  
// 4

5. first/last

  • 첫번째 요소/마지막 요소만 방출
Observable.of("A", "B", "C")  
.first() // .last()  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

// A / C

6. ignoreElements

  • 모든 요소를 무시하고 완료 또는 오류 이벤트만 전달
Observable.of("A", "B", "C")
    .ignoreElements()
    .subscribe(onCompleted: {
        print("Completed")
    })
    .disposed(by: disposeBag)

// Completed

7. sample

  • 기준이 되는 Observable의 가장 최근의 요소를 방출합니다.
let source = PublishSubject()  
let trigger = PublishSubject()

source  
.sample(trigger)  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

source.onNext("A")  
source.onNext("B")  
trigger.onNext(()) // "B" 방출  
source.onNext("C")  
source.onNext("D")  
trigger.onNext(()) // "D" 방출

8. skip

  • n개의 요소를 건너뛴 후 방출
Observable.of("A", "B", "C", "D")  
.skip(2)  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

// C D

9. skipLast

  • 마지막 n개의 요소를 무시
Observable.of("A", "B", "C", "D")  
.skipLast(2)  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

// A B

10. take

  • 처음 n개의 요소만 방출하고 이후 요소는 무시
Observable.of("A", "B", "C", "D")  
.take(2)  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

// C D

11. takeLast

  • 마지막 n개의 요소만 방출
Observable.of("A", "B", "C", "D")  
.takeLast(2)  
.subscribe(onNext: { print($0) })  
.disposed(by: disposeBag)

// C D