[RxSwift] Filtering Operators

Judy·2023년 3월 8일
0

RxSwift

목록 보기
3/6
post-thumbnail

fimuxd/RxSwift를 참고해 정리하는 글입니다 🙂

Filtering Operators

  • .next 로 받아오는 이벤트를 선별할 수 있다
  • Swift의 filter 와 비슷한 느낌

Ignore

1) ignoreElements

  • .next 로 받아오는 모든 이벤트를 무시
  • completederror 는 허용
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() // completed만 됨

2) elementAt

  • 특정 인덱스를 제외하고 모두 무시
  • 특정 인덱스를 방출하면 바로 completed 처리됨
let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
     
strikes
	.element(at: 2)
	.subscribe(onNext: { event in
		print(event)
	})
	.disposed(by: disposeBag)
     
strikes.onNext("A")
strikes.onNext("B")
strikes.onNext("C") 

// C

3) filter

  • 특정 조건을 만족하는 이벤트만 방출
let disposeBag = DisposeBag()
     
Observable.of(1,2,3,4,5,6)
	.filter({ (int) -> Bool in
		int % 2 == 0
	})
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)

// 2
// 4
// 6

Skipping

1) skip

  • 처음 n개의 이벤트를 무시 (인덱스가 아니라 개수)
let disposeBag = DisposeBag()
     
Observable.of("A", "B", "C", "D", "E", "F")
	.skip(3)
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)

// D
// E
// F

2) skipWhile

  • 지정한 조건이 거짓이 될 때까지 방출하는 항목을 무시
  • = 지정한 조건을 만족하는 이벤트는 무시하다가 불만족할 때부터 방출
let disposeBag = DisposeBag()

Observable.of(2, 2, 3, 4, 4)
	.skip(while: { (int) -> Bool in
		int % 2 == 0
	})
	.subscribe(onNext: {
		print($0)
	})
.disposed(by: disposeBag)

// 3
// 4
// 4

3) skipUntil

  • 두 번째 Observable이 이벤트를 내보낼 때까지 이벤트를 무시
let disposeBag = DisposeBag()
    
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
     
subject
	.skip(until: trigger)
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)
     
subject.onNext("A")
subject.onNext("B")
     
trigger.onNext("X")
     
subject.onNext("C")
// C

Taking

1) take

  • 처음 n개의 이벤트만 방출
let disposeBag = DisposeBag()

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

// 1
// 2
// 3

2) takeWhile

  • 지정한 조건이 거짓이 되기 전까지 이벤트만 방출
  • skipWhile 과 비슷하지만 반대로 동작
let disposeBag = DisposeBag()
    
Observable.of(2,2,4,4,6,6)
	.enumerated()  // 인덱스(index)를 알 수 있게 
	.take(while: { index, value in
		value % 2 == 0 && index < 3
	})
	.map { $0.element }
	.subscribe(onNext: {
		print($0)
})
.disposed(by: disposeBag)

// 2
// 2
// 4

3) takeUntil

  • 두 번째 Observable이 emit하기 전까지만 방출
  • 두 번째 Obseranble이 이벤트를 방출한 이후는 무시
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()
     
     // 2
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
someObservable
 	.take(until: self.rx.deallocated)
 	.subscribe(onNext: {
 		print($0)
 	})
// self를 뷰컨트롤러나 뷰모델로 하여 dispose에 담는 대신에 구독을 dispose할 수 있음

Distinct

Observable이 방출하는 중복 항목 억제

  • 중복된 값(이전에 나온 값)은 무시

1) distinctUntilChanged

  • 연속되는 중복된 값을 무시
  • 이전에 나온 값이어도 연달아 나오지 않았으면 방출
let disposeBag = DisposeBag()
     
Observable.of("A", "A", "B", "B", "A")
	.distinctUntilChanged()
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)

// A
// B
// A

2) distinctUntilChanged(_:)

  • 비교로직을 커스텀해서 사용




참고
ReactiveX-Operators

profile
iOS Developer

0개의 댓글