[RxSwift] Filtering Operator

2020. 4. 7. 17:20iOS/RxSwift

filtering Operator를 이용하면

.next이벤트에 조건부 제약 조건을 적용해 처리하고자 하는 요소만 받을 수 있도록 할 수 있다.

ignore

.next event는 무시한다.

.error이나 .complete는 전달한다.(종료되는 시점만 알 수 있음)

let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
    .ignoreElements()
    .subscribe { _ in
    print("[Subsscription is called]")
}.disposed(by: disposeBag)

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

strikes.onCompleted()
// onCompleted를 하니까 프린트가 된다.(그 전에는 안됐음)
// [Subsscription is called]

ElementAt

  • 발생하는 이벤트 중 n번째 이벤트 받고싶을 때 사용한다.

  • 인덱스는 0부터 시작한다는 것을 잊지 말자

let strikes = PublishSubject<String>()
let disposeBag = DisposeBag()
strikes
    .elementAt(2)
    .subscribe(onNext: { value in
        print("You are out! -> \(value)")
    }).disposed(by: disposeBag)

strikes.onNext("a")
strikes.onNext("b")
strikes.onNext("c")
// You are out! -> c

Filter

  • 조건에 맞는 값만 필터링하는 것이다.
Observable
    .of(1,2,3,4,5,6,7)
    .filter { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
// 2,4,6

Skip

  • 처음 발생하는 n개의 이벤트를 무시할 수 있다.
Observable
    .of("A","B","C","D","E","F")
    .skip(3)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
// D, E, F

Skip While

  • filter와 기능이 유사하다.
  • filter는 통과 된 element를 전달하지만, skipWhile은 통과되지 못한 element를 전달한다.
  • 한번이라도 조건을 만족하면 계속 element 전달
Observable
    .of(2,2,3,4,4)
    .skipWhile { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
// 3, 4, 4

Skip Until

  • trigger가 되는 시퀀스에서 이벤트가 발생하기 전까지 모든 이벤트가 skip된다.
let subject = PublishSubject()let trigger = PublishSubject()

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

subject.onNext("A")subject.onNext("B")

trigger.onNext("X")

subject.onNext("C")

take

  • 처음 발생하는 n개의 이벤트만 받고 나머지는 무시
Observable
    .of(1,2,3,4,5,6)
    .take(3)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
// 1,2,3

take While

  • skip While과 유사
  • 검사가 통과된 이벤트는 전달한다.
  • 만약 통과하지 못한 이벤트가 있다면 그 이벤트와 이후 이벤트 모두 무시된다.
Observable
    .of(2,4,6,8,9,10)
    .takeWhile { $0 % 2 == 0 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)
// 2,4,6,8

take Until

  • skip Until과 유사
  • trigger에 이벤트가 발생하면 이후 이벤트 모두 무시된다.
let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

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

subject.onNext("1")
subject.onNext("2")
trigger.onNext("X")
subject.onNext("3")
// 1, 2

 

가만히 보고 있자니 해석하니 어떻게 사용해야 되는지 알 것 같다.

다만, 사용할 때 이게 갯수를 가리키는지 인덱스를 가리키는지 제대로 알고 써야되겠다.

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Combining Operator  (0) 2020.04.25
[RxSwift] Transforming Operator  (0) 2020.04.18
[RxSwift] Observable & Subject  (0) 2020.04.02