Tunko Development Diary

RxSwift) Filtering Operators [ignoreElements, element(at:), filter, skip, skip(while:), skip(until:), skip(duration:scheduler:)] 본문

Development/RxSwift

RxSwift) Filtering Operators [ignoreElements, element(at:), filter, skip, skip(while:), skip(until:), skip(duration:scheduler:)]

Tunko 2022. 5. 31. 20:50

ignoreElements

let disposeBag = DisposeBag()
let elements = [0,1,2,3,4,5]

Observable.from(elements)
    .ignoreElements()
    .subscribe { print($0) }
    .disposed(by: disposeBag)

옵저버블이 방출하는 Next 이벤트는 무시 error와 completed 이벤트만 받습니다.

element(at:)

let disposeBag = DisposeBag()
let elements = [0,1,2,3,4,5]

Observable.from(elements)
    .element(at: 3)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

특정인덱스에 위치한 속성을 방출하는 방법 정수 인덱스를 받아서 하나의 요소만 방출합니다.

filter

let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Observable.from(numbers)
    .filter{ $0.isMultiple(of: 2) }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

Observable.from(numbers)
    .filter{ $0 == 10 }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

출력

next(2)
next(4)
next(6)
next(8)
next(10)
completed
next(10)
completed

filter 조건이 true 일때 데이터가 방출됩니다.

스킵은 4가지 버전이 있습니다.

skip

let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Observable.from(numbers)
    .skip(3)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

출력

next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
next(10)
completed

skip에 들어가는 속성은 Count입니다. Index가 아닙니다.

skip(while:)

let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Observable.from(numbers)
    .skip{ !$0.isMultiple(of:2) }
    .subscribe{ print($0) }
    .disposed(by: disposeBag)

출력

next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
next(10)
completed

skip(while:) 연산자는 클로저를 파라미터로 받습니다. 클로저에서 true 리턴시 앞서 방출된 Next 이벤트를 무시합니다. 클로저에서 false 리턴시 Next 이벤트를 방출합니다. false 다음으로 받은 Next 이벤트는 모두 방출합니다.

처음 들어온 값이 1이고 false이기에 무시됩니다. 이 다음 부터 방출됩니다.

skip(until:)

let disposeBag = DisposeBag()

let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()

subject1.skip(until: subject2)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

subject1.onNext(1)
// 반응없음
subject1.onNext(1)
// 반응없음
subject2.onNext(2)
// 반응없음
subject1.onNext(3)
// 결과 나옴

skip(until:)은 트리거가 이벤트를 방출한 이후에 새롭게 방출된 이벤트만 방출됩니다.

여기서 말하는 트리거는 skip(until: subject2) 입니다. subject2 에서 next 이벤트가 발생된 후 부터 subject1 이 이벤트를 받게 됩니다.

skip(duration:scheduler:)

이 skip은 입력시간만큼 이벤트를 무시하는 연산자 입니다.

let disposeBag = DisposeBag()

let oneSecondesObservable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)

oneSecondesObservable
    .take(10)
    .skip(.seconds(3), scheduler: MainScheduler.instance)
    .subscribe { print($0) }
    .disposed(by: disposeBag)
public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType)
        -> Observable<Element> {
    SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
}

출력

next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
next(8)
next(9)
completed

함수 원형을 보면 두개의 인자를 받습니다.

  • duration: RxTimeInterval 인자는 무시하는 시간
  • scheduler 는 스케쥴러입니다.

oneSecondesObservable 옵저버블은 메인스케쥴에서 1초마다 방출하는 옵저버블입니다.

// 10회제한 take(10)

// 메인스케쥴에서 3초 무시 .skip(.seconds(3), scheduler: MainScheduler.instance)

반응형
Comments