ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - Operator를 시작해보자.
    Ray Wenderlich/RxSwift 2018. 3. 28. 23:03


    Filtering Operators  p.103 ~ p.107



    이전 챕터까지, RxSwift의 주요 개념을 알아보았다. 


    RxSwift를 하나의 건물로 비유하자면, 이제 건물의 뼈대는 세운 것이다.

    지금부터는, 건물의 층을 하나씩 올려보자!!


    이번 챕터(Ch.5)에서는 RxSwift의 Filtering Operator를 사용하여, .next이벤트에 조건을 추가하게 된다.

    조건을 추가하면, 발생하는 모든 이벤트가 아니라!! 우리가 원하는 이벤트만 받을 수 있다.


    Swift의 컬렉션의 filter(_:)를 사용해봤다면, 이해가 훨씬 수월할 것이다.

    안써봤어도 걱정말자!! 쉬우니깐!


    Ignoring operators

    먼저 ignoreElements()를 알아보자. 이름에서 유추할 수 있듯, 모든 .next event를 무시한다.

    다만 종료  event는 전달한다. (.error 또는 .complete)

    결론적으로, 시퀀스가 종료되는 시점만 알 수 있게 되는 것이다.


    그림을 보자.

    그림에서 위 라인에서 1, 2, 3 이벤트가 발생하고 있다. 하지만 이 이벤트는 ignoreElements()에 걸려 통과하지 못하고 있다.

    결국, subscribe하고 있는 아래 라인에서는 어떤 이벤트도 받지 못한다.

    시퀀스가 종료되는 이벤트는 전달이 되고 있음을 알 수 있다. (점선표시)


    코드를 통해서도 알아보자. (야구를 생각해보면 쉽다. 스트라이크가 3번이면 1아웃)

    strikes시퀀스에 ignoreElements()가 호출되고, 이를 subscribe하고 있다.

    "X" next이벤트가 3번이나 발생하지만, print문은 수행되지 않는다.

    complete이벤트가 발생해야 비로소 print문이 수행된다.


    호출 결과

    세 번째 스트라이는 아웃이다!


    Element At

    이런 경우는 어떨까? Observable에서 발생하는 이벤트 중 n번째 이벤트만 받고 싶다.

    위 예제에서, 3스트라이크 아웃!!을 표현하기 위해 굳이 .onCompleted()를 호출해야할까?

    그냥 3번째 스트라이크 이벤트가 발생하면 그 자체가 아웃을 의미하는 것 아닌가??

    이 때 사용할 수 있는 Operator가 elementAt(:_)이다.

    (무슨소리야.. 할 수 있는데.. 그림보면 이해가 쉬울 거에요 ㅠㅠ)


    그림을 통해 알아보자.

    위 라인에서 1, 2, 3의 이벤트가 발생하고 있다.

    하지만 난 모든 이벤트를 subscribe하고 싶지가 않다!

    1번째에 발생하는 이벤트만 subscribe하고 싶다. (개발자는 인덱싱을 0부터 시작하죠?)

    즉, elementAt(1)을 거친 Observable을 subscribe하면, 2에 해당하는 이벤트만 받을 수 있는 것이다.


    더 쉽게!! 코드를 통해 알아보자.

    strikes를 subscribe한다.

    하지만 2번째 이벤트에만 반응할 것이다.

    0번 째, 1번 째는   elementAt(2)가 걸러주기 때문이다.


    총 세 번의 .next이벤트가 발생했다. (.complete이벤트는 발생하지 않았다.)


    3번의 스트라이크는 뭐다?? 아웃이다!!!


    ignoreElementselementAt은 다 이해가 되었나요?

    이제 filter로 넘어가 봅시다!


    Filter

    filter는 Bool을 리턴하는 클로져를 받아서 모든 Observable Event를 검사한다.

    클로져를 true로 만족시키는 event만 filter를 통과하게 된다.


    그림을 통해 알아보자.

    위 시퀀스에서 1, 2, 3에 해당하는 이벤트가 발생하고 있다. 이 시퀀스에 { $0 < 3 }이라는 filter를 걸었다.

    이 클로져를 만족시키는 이벤트는 1, 2뿐이다. 3은 false를 리턴하여 만족시키지 못했다.

    그 결과 위 시퀀스를 subscribe하고 있는 아래 시퀀스에서는 1, 2에 해당하는 이벤트만 전달받게 된다.


    코드를 통해 알아보자.

    1. 6개의 Int타입 이벤트를 발생시킨다.

    2. filter를 걸었다. filter로 전달된 클로져에서는 이벤트의 Element가 짝수인지 검사한다.

    3. filter된 이벤트들을 subscribe하여 출력해주고 있다.


    결과는 아래와 같다.


    다음은 Skipping Operators부터 시작해볼게요~!

    댓글 0

Designed by Tistory.