-
RxSwift - skip, skipWhile, skipUntil에 대해서 알아보자.Ray Wenderlich/RxSwift 2018. 4. 4. 01:51
Ch5. Filtering Operators (2) p.108 - p.111
지난 포스트에서 ignore, elementAt, filter Operator에 대해서 알아보았다.
이 포스트에서는 skip, skipWhile, skipUntil Operator에 대해서 알아보겠다.
Skipping operators
skip(_:)
시퀀스에서 발생하는 이벤트 중 초반 몇개는 받고 싶지 않을수가 있다.
예를 들어, 일기예보를 받아보는 경우를 생각해보자.
일기예보를 받고 싶지만 난 오전 날씨가 궁금하지가 않다.
근데 일기예보는 오전날씨부터 주구장창 알려줄거란 말이죠?? 이런 경우에, skip을 사용해서 오전날씨는 패스할 수 있겠네요.
시퀀스에 skip Operator가 전달되면, 처음에 발생하는 n개의 이벤트를 무시할 수 있다.
skip(2)를 사용하는 경우를 그림으로 살펴보자.
처음에 발생한 2개의 이벤트. 즉 1과 2가 무시되고, 3만 전달된다.
코드를 통해 살펴보자.
1. A, B, C, D, E, F에 해당하는 이벤트가 발생하고 있다.
2. skip(3)을 사용하여 첫 3개의 이벤트는 무시한다.
로그는 어떻게 찍힐까?
skipWhile(_:)
skip은 친구들이 있다. 그 친구가 누구냐! 바로 skipWhile, skipUntil이다.
이 친구들의 기능은 이름에서 유추할 수 있다. 살펴보도록 하자.
skipWhile은 filter와 기능이 유사하다.
filter는 클로져 검사를 통과하는 Element만 전달되는 반면, skipWhile을 검사를 통과하지 못한 Element를 전달하게 된다.
skipWhile Operator는 클로져를 전달받아, 이벤트의 Element를 검사한다.
이 검사를 통과한 이벤트는 모두 무시(skip)한다.. 처음으로 이 검사를 통과하지 못한 이벤트가 나타나면, 이 후 이벤트들은 모두 전달된다.
말이 어렵다... 그림을 통해 살펴보자.
skipWhile에 전달된 클로져 { $0 % 2 == 1 }로 Element를 검사하게 된다.
첫 이벤트부터 순차적으로 검사하게 된다.
1을 대입한 클로져는 true를 리턴한다. 그 결과 1은 skip되어 전달되지 못한다.
2를 대입한 클로져는 false를 리턴하기 때문에, skip하지 않고 무사히 전달된다.
그 이후 이벤트들은 클로져 검사와 관계 없이 모두 전달된다.
코드를 통해 살펴보자.
1. Observable 시퀀스를 생성한다. 2, 2, 3, 4, 4에 해당하는 이벤트들이 있다.
2. 짝수 Element는 skip해주세요.
로그는 어떻게 찍힐까?? 아래와 같다.
skipUntil(_:)
지금까지 Static하게 skip하는 경우만 살펴보았다.
Static하다는건 빌드 타임에 정의한 클로져를 통한 검사. 예를 들어, 짝수인 경우에 스킵한다. 처음에 발생한 2개의 이벤트는 스킵한다.는 식의 Static한 조건 말이다.
하지만 Dynamic하게 제어하고 싶다면?
Dynamic한 filtering을 제공하는 몇 가지 Operator가 있다.
첫 번째로, skipUntil을 알아보자.
아래 그림에는 두 개의 시퀀스가 등장한다.
하나의 시퀀스에서 이벤트가 계속 발생하고 있다.
이 시퀀스에 skipUntil을 걸고, 다른 시퀀스를 전달해주면 어떻게 될까? (다른 시퀀스는 trigger 시퀀스라고 하자.)
결과는, Trigger시퀀스의 이벤트가 발생할 때 까지, 원래 시퀀스의 모든 이벤트가 skip된다.
데이터 시퀀스에서 1, 2, 3이 발생하고 있다. 하지만 Trigger의 .next이벤트가 발생할 때까지는 skip해주세요. 라는 의미의 skipUntil이 걸려있다.
그 결과, 보라색 이벤트가 발생하기 전의 모든 이벤트가 무시된다. 즉, 1이 무시되고 2, 3이 전달되고 있다.
코드를 통해 살펴보자.
1. 이벤트를 발생시킬 PublishSubject와 trigger역할을 해줄 PublishSubject를 만들었다.
2. subject를 subscribe한다. 하지만 skipUntil에 trigger를 전달함으로써, trigger의 .next이벤트 이전에 발생하는 데이터를 모두 skip하게 된다.
이제 이벤트를 발생시켜보자.
subject에 "A", "B"이벤트를 발생시킨다. 하지만 아무것도 프린트되지 않을 것이다. 왜냐!! trigger에 아직 .next이벤트가 발생하지 않았기 때문에 skip되는 것이다.
trigger에 .next이벤트가 발생했다.
이제부터는 subject에서 발생하는 이벤트들이 skip되지 않을 것이다.
당연히, "C"는 로그에 찍힌다.
다음은 take와 distinct에 대해서 알아보겠습니다 :)
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - throttle에 대해서 알아보자. (0) 2018.05.10 RxSwift - take, takeWhile, takeUntil에 대해서 알아보자. (1) 2018.04.05 RxSwift - Operator를 시작해보자. (0) 2018.03.28 RxSwift - Subject란? (PublishSubject, Behavior Subject, Replay Subject, Variable) (1) 2018.02.14 RxSwift - Dispose란? (Disposable, DisposeBag) (0) 2018.02.06