웰코발
웰코's iOS
웰코발
전체 방문자
오늘
어제
  • 분류 전체보기 (63)
    • Swift (26)
    • rxSwift (13)
    • SwiftUI (3)
    • iOS (12)
    • 기타 (1)
    • 개발관련 용어정리 (6)
    • 면접준비 (0)
    • 공공데이터 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ReactorKit
  • Scroll
  • Coordinator
  • 대기오염통계 현황
  • delay
  • uitableview
  • WKWebView
  • 주제구독
  • content_available
  • cell
  • 측정소정보
  • SWIFT
  • 디자인
  • swiftUI
  • alamofire
  • rxswift
  • ios
  • Observable
  • UI
  • collectionview

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
웰코발

웰코's iOS

[rxSwift] Filtering Operator 의 종류
rxSwift

[rxSwift] Filtering Operator 의 종류

2022. 10. 22. 14:22

Filtering Operator 의 종류

ignoreElements

  • next 이벤트를 무시함
  • completed, error 같은 정지이벤트는 허용함.

let publishSubject = PublishSubject<String>()

let disposeBag = DisposeBag()

publishSubject
    .ignoreElements()   // 모든 이벤트 무시
    .subscribe({
        print($0)
    })
    .disposed(by: disposeBag)

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

publishSubject.onCompleted()


// A, B, C 는 출력되지 않고 무시됨

// onCompleted

 

elementAt

  • 특정 인덱스에 해당하는 요소만 방출함, 나머지는 무시함. (Index 기준)

let publishSubject = PublishSubject<String>()

let disposeBag = DisposeBag()

publishSubject
    .element(at: 2) //2번째 인덱스일때 방출
    .subscribe(onNext: { element in
        print(element)
    }).disposed(by: disposeBag)

publishSubject.onNext("0")
publishSubject.onNext("1")
publishSubject.onNext("2")

// 1

 

filter

  • 방출된 이벤트 중 클로저 내 조건에 맞는 이벤트만을 방출함.
  • 방출된 이벤트가 filter 클로저 내 조건이 true일 때 이벤트 방출함.

let disposeBag = DisposeBag()

Observable.of(1, 2, 3, 4, 5, 6, 7)
    .filter { $0 % 2 == 0}	// 2의 배수만을 방출
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
    
// 2
// 4
// 6

 

skip

  • 첫번째 요소를 기준으로 몇개의 요소를 스킵할건지에 대한 연산자임. (Count 기준)

let disposeBag = DisposeBag()

Observable.of("A", "B", "C", "D", "E", "F")
    .skip(4)      // 4번째 까지는 skip
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)


// E
// F

 

skipWhile

  • while 클로저 안의 로직이 true일 때까지 무시한 후 방출.
  • 즉, skipwhile 조건문이 false가 되는 시점의 element부터 방출함.

let disposeBag = DisposeBag()

Observable.of(2, 2, 3, 4, 4, 5)
    .skip(while: { $0 % 2 == 0})  // 2의 배수가 아닌 시점부터 방출
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)


// 3
// 4
// 4
// 5

 

skipUntil

  • 다른 Observable을 기준으로 다이나믹하게 필터하고 싶으면 skipUntil 사용함.
  • 기준이 되는 Observable이 이벤트를 나타내기 전까지 요소들을 무시함. 
  • 기준이 되는 Observable은 Trigger라고도 함.
    1. 원본 Observable은 다른 Observable(Trigger)을 파라미터로 받음.
    2. 이 Trigger Observable가 Next 이벤트를 전달하기 전까지 원본 Observable이 전달하는 이벤트를 무시함.
    3. 파라미터로 전달하는 Observable을 Trigger 라고도 부름.
    4. Trigger Observable이 방출할 때까지 원본 observable에서 방출하는 이벤트를 skip함.

let disposeBag = DisposeBag()

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

mainSubject.skip(until: trigger)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)


mainSubject.onNext("A")  // 무시
mainSubject.onNext("B")  // 무시

trigger.onNext("X")  //트리거

mainSubject.onNext("C")  // 방출


// C

 

take

  • 첫번째 요소를 기준으로 몇개의 요소를 나타날건지에 대한 연산자임. (Count 기준)
  • skip 연산자와 반대되는 개념.

let disposeBag = DisposeBag()

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

let subject = PublishSubject<Int>()

subject.take(2)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)


subject.onNext(1)
subject.onNext(2)
subject.onNext(3)

// 1
// 2

 

takeWhile

  • while 구문 내에서 true일 때까지 방출함. (false가 나타나기 전까지)
  • skipWhile 연산자와 반대되는 개념.

let disposeBag = DisposeBag()

Observable.of(4, 2, 3, 4, 5, 6)
    .take(while: {
        return $0 % 2 == 0  // 2의 배수가 나타나는 시점 까지만 방출
    }).subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

// 4
// 2

let subject = PublishSubject<Int>()

subject.take(while: {
    return $0 % 2 == 0  // 2의 배수가 나타나는 시점 까지만 방출
}).subscribe(onNext: {
    print($0)
})
    .disposed(by: disposeBag)

subject.onNext(0)
subject.onNext(2)
subject.onNext(4)
subject.onNext(1)

//0
//2
//4

 

takeUntil

  • 다른 Observable을 기준으로 다이나믹하게 필터하고 싶으면 takeUntil 사용함.
  • 기준이 되는 Observable이 이벤트를 나타내기 전까지 요소들을 나타냄.
  • 기준이 되는 Observable은 Trigger라고도 함.
    1. 원본 Observable은 다른 Observable(Trigger)을 파라미터로 받음.
    2. 이 Trigger Observable가 Next 이벤트를 전달할 때까지 원본 Observable이 전달하는 이벤트를 방출함.
    3. 파라미터로 전달하는 Observable을 Trigger 라고도 부름.
    4. Trigger Observable이 방출할 때까지 원본 observable에서 방출하는 이벤트를 방출함.

let disposeBag = DisposeBag()

let subject  = PublishSubject<String>()

let trigger = PublishSubject<String>()

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

subject.onNext("1")
subject.onNext("2")

trigger.onNext("X")

subject.onNext("3")

// 1
// 2

 

enumerated

  • 방출된 요소의 index를 참고하고 싶을때 사용
let disposeBag = DisposeBag()

Observable.of("1", "2", "3", "4", "5")
.enumerated()	// 각 이벤트를 indexing 시킴.
.takeWhile {
   $0.index < 3
 }
.subscribe(onNext: {
   print($0)
 })
.disposed(by: disposeBag)

 

distincUntilChanged

  • 연달아 같은 요소가 이어질때 중복된 방출을 막아주는 역할

let disposeBag = DisposeBag()

Observable.of(1, 2, 2, 1, 3)
   .distinctUntilChanged()
   .subscribe(onNext: {
       print($0)
   })
   .disposed(by: disposeBag)
   
 // 1
 // 2
 // 1
 // 3

 

'rxSwift' 카테고리의 다른 글

[rxSwift] Combining Operator 의 종류  (0) 2022.10.27
[rxSwift] Transforming Operator 의 종류  (0) 2022.10.23
[rxSwift] Subject 를 wrapping한 Relay 사용법  (0) 2022.10.21
[rxSwift] Subject 에 대한 이해와 종류  (0) 2022.10.21
[rxSwift] Dispose 는 왜 하는 걸까?  (0) 2022.10.20
    'rxSwift' 카테고리의 다른 글
    • [rxSwift] Combining Operator 의 종류
    • [rxSwift] Transforming Operator 의 종류
    • [rxSwift] Subject 를 wrapping한 Relay 사용법
    • [rxSwift] Subject 에 대한 이해와 종류
    웰코발
    웰코발
    나의 개발 일지

    티스토리툴바