Filtering Operators

Youn·2021년 12월 4일
0

iOS-RxSwift

목록 보기
7/8

ignoreElements

옵져버블이 방출하는 next 이벤트를 필터링, completed 와 error 이벤트만 구독자로 전달

Observable.from([1,2,3])
	.ignoreElements()
	.subscribe {print($0)}
    .disposed(by: disposeBag)
  • 작업의 성공/실패에만 관심 있을 때 사용

elementAt

특정 인덱스에 위치한 요소를 제한적으로 방출, 구독자에게 하나의 요소만 전달되고 나머지는 무시

Observable.from([1,2,3])
	.elementAt(1)
	.subscribe {print($0)}
    .disposed(by: disposeBag)

--- 2 요소만 방출


## filter 
> 옵져버블이 방출하는 요소 필터링
```swift 
Observable.from(Array(1...10)
	.filter { $0.isMultiple(of: 2) }
	.subscribe {print($0)}
    .disposed(by: disposeBag)
    
--- 구독자로 짝수 요소만 방출

skip, skipwhile, skipUntil

특정 요소를 무시

skip

<!-- 1. Skip --> 
Observable.from([1,2,3])
	.skip(3)
	.subscribe {print($0)}
    .disposed(by: disposeBag)
  • 정수를 파라미터로 받음
  • 파라미터의 값만큼 요소를 무시한 뒤 이후 방출되는 요소가 포함되는 옵져버블 전달
  • 파라미터를 count 로 생각하기

skipWhile

<! -- 2. SkipWhile -->
Observable.from([1,2,3])
	.skipWhile { !$0.isMultiple(of: 2) }
	.subscribe {print($0)}
    .disposed(by: disposeBag)

-- 2, 3  전달
  • 파라미터로 받은 클로저가 true 를 리턴하는 동안 방출 무시
  • false 리턴 이후에는 더이상 조건 판단 X

skipUntil

<! -- 3. skipUntil -->
let subject = PublishSubject<Int>()
let trigger = PublishSubject<Int>()

subject.skipUntil { trigger }
	.subscribe {print($0)}
    .disposed(by: disposeBag)

// subject 에서 요소 방출
subject.onNext(1)

trigger.onNext(0)

subject.onNext(2)
-- next(2)
  • 파라미터로 받은 옵져버블(트리거)가 next 이벤트를 전달하기 전까지 원본 옵져버블 전달 X

take, takeWhile, takeUntil, takeLast

요소 방출 조건 설정

take

Observable.from([1,2,3])
	.take(2)
	.subscribe {print($0)}
    .disposed(by: disposeBag)
-- 1, 2 방출
  • 파라미터로 정수를 받음, 해당 숫자 만큼만 요소 방출

takeWhile

Observable.from([1,2,3])
	.takeWhile{ !$0.isMultiple(of: 2) }
	.subscribe {print($0)}
    .disposed(by: disposeBag)
-- 1
  • 파라미터로 받은 클로져가 true 인동안 방출
  • false 를 리턴하면 더이상 요소 방출 X

takeUntil

let subject = PublishSubject<Int>()
let trigger = PublishSubject<Int>()

subject.takeUntil { trigger }
	.subscribe {print($0)}
    .disposed(by: disposeBag)

// subject 에서 요소 방출
subject.onNext(1)

trigger.onNext(0)

subject.onNext(2)
-- next(1)
    • 파라미터로 받은 옵져버블(트리거)가 next 이벤트를 전달하기 전까지 원본 옵져버블에서 next 이벤트 전달

takeLast

let subject = PublishSubject<Int>()

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

[1,2,3].forEach { subject.onNext($0) }  // 버퍼 2,3

subject.onNext(11) // 버퍼 3, 11

subject.onCompleted() // 요소 방출 
subject.onError(MyError.error) // 버퍼 요소 방출 없이 에러이벤트만 방출
  • 정수를 파라미터로 받아 observable 리턴
  • 리턴되는 observable 에는 원본 옵져버블 마지막 n 개의 요소 포함
  • 구독자로 전달되는 시점이 지연됨

single

원본 옵져버블에서 첫번째 요소만 방출 / 조건과 일치하는 첫번째 요소 방출

Observable.just(1)
	.single()
	.subscribe {print($0)}
    .disposed(by: disposeBag)

-- 1 전달 , completed

Observable.from([1,2,3])
.single()
.subscribe {print($0)}
.disposed(by: disposeBag)

-- 1 전달 , error


- 원본 옵졉버블에서 completed 전달될때까지 기다림

## distinctUntilChanged
> 동일한 항목이 연속적으로 방출되지 않도록 필터링
2개의 요소를 비교하여 이전과 동일하면 방출 X
```swift
Observable.from(Array(1...10))
	.distinctUntilChanged()
	.subscribe {print($0)}
    .disposed(by: disposeBag)

debounce, throttle

짧은 시간동안 반복적으로 방출되는 이벤트 제어

debounce

  • 정해진 시간동안 이벤트가 방출되지 않으면 마지막 이벤트 방출, 이벤트 방출되면 타이머 초기화
  • 검색 기능에 활용

throttle

  • 정해진 시간동안 하나의 이벤트만 전달
  • 탭 이벤트 처리에 활용
profile
youn

0개의 댓글