ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - flatMap에 대해서 알아보자.
    Ray Wenderlich/RxSwift 2018. 6. 2. 22:54


    Ch7. Transforming Operators p.146 - p.151


    Transforming inner observables

    inner observable이라 함은 Observable안에 있는 Observable을 말한다.

    inner Observable을 다루기 위해 필요한 flatMap에 대해서 알아보도록 하자.


    문서에서는 flatMap을 이렇게 설명하고 있다.

    Observable시퀀스의 element당 한 개의 새로운 Observable 시퀀스를 생성한다. 이렇게 생성된 여러개의 새로운 시퀀스를 하나의 시퀀스로 합쳐준다.

    (원문: Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence)


    말로는 잘 이해가 되지 않을 수 있다. (저도 첨엔 이해가 안되서, 구글링해보니 그제서야 이해가 되었습니다. ㅜㅜ)

    심지어 이번엔 그림도 좀 복잡하다...


    설명과 함께 그림을 차근차근 살펴보자.

    1.

    01엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 이 시퀀스는 01엘리먼트의 value에 대한 시퀀스다. 

    새로 생성된 시퀀스에 10 이벤트가 발생했고, 최종 시퀀스(제일 하단 시퀀스)로 전달되었다. 

    즉, 01엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생하는 것이다.


    2.

    02엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 마찬가지로, 이 시퀀스는 02엘리먼트의 value에 대한 시퀀스다. 

    새로 생성된 시퀀스에 20 이벤트가 발생했고, 최종 시퀀스로 전달되었다. 

    02엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생한다. 02도 마찬가지다.


    3.

    01엘리먼트의 value에 변동이 생겼다. 1에서 4로 바뀐 것이다. (1에서 4로 바뀌는것이 그림에는 표현되지 않았습니다. 그림이 지저분해지니깐) 

    flatMap이 생성한 시퀀스 중 01엘리먼트에 해당하는 시퀀스에 40이라는 이벤트가 발생하여, 최종 시퀀스로 전달되었다.


    4.

    02엘리먼트의 value에 변동이 생겼다. 2에서 5로 바뀐것이다. 

    그래서, flatMap이 생성한 02엘리먼트에 해당하는 시퀀스에 50이라는 이벤트가 발생했고, 최종 시퀀스로 전달되었다.


    정리해보자면, flatMap은 한 시퀀스의 element를 전달받아 이를 변형한 새로운 시퀀스를 만들고, (Element하나당 Sequence하나를 생성)

    이 시퀀스에서 발생하는 모든 이벤트를 최종 시퀀스로 전달하는 것이다.


    코드를 통해 살펴보자.


    예제에서 계속 사용될 Student를 하나 정의하고 가자.

    Int타입 Observable을 갖고 있다. Observable in observable을 표현하기 위함!!


    1. Student타입 변수 2개를 생성했다. score가 각각 ryan은 80점, charlotte은 90점으로 초기화가 되었다.

    2. Student타입의 Subject를 생성했다. (예상하건데, 이 Subject에는 ryan과 charlotte이 들어가게 될 듯)

    3. student시퀀스를 flatMap으로 transform하려고 한다. 어떻게 transform할 것인가? 바로 student안에 있는 score로 transform한다.

    4. student시퀀스에서 transform된, score 시퀀스를 subscribe하게 된다. next이벤트 발생 시, Int타입의 score를 print하게 된다.


    이제 셋팅을 했으니, next이벤트를 발생시키면서 돌아가는 꼴을 한번 보자!

    (아래 추가되는 코드들을 위 그림에 연상시키면서 보길 권장합니다.)



    아래 코드를 넣어보겠다.


    결과는 아래와 같다.


    그럼 이번에 ryan의 score를 바꿔보자.


    바뀐 score가 출력될 것이다.


    이번엔 charlotte을 student에 추가해보자.


    charlotte의 초기 score인 90이 출력될 것이다.


    자, 시작은 지금부터다. ryan의 score를 또 바꿔보자.


    새로운 score가 또 출력된다.


    flatMap이 ryan의 score를 계속 주시하고 있는것이다. 

    flatMap은 student의 element인 ryan에 해당하는 시퀀스를 만들었다.

    이 시퀀스에는 ryan의 score의 변화가 기록된다. 그리고 최종 시퀀스로 전달하고 있는 것이다.


    charlotte도 마찬가지다. student.onNext(charlotte)가 실행되었을 때, charlotte의 score에 해당하는 시퀀스가 생긴 것이다.

    charlotte의 score를 바꿔보자.

    잘 출력된다.


    flatMap은 observable의 element의 변화를 계속 관찰하고 있다.

    이런 기능이 필요한 상황이 있을테니, 잘 알아두자!


    flatMap은 original sequence의 모든 Element를 관찰하고 있다.

    하지만, original sequence의 가장 마지막 Element만 관찰하는 flatMapLatest라는 Operator가 있다.

    다음 포스트에서는 flatMapLatest에 대해서 알아보겠다.


    << flatMapLatest로 이동하기>>



    발번역 죄송합니다.

    저도 이해력이 딸리는지라, 처음엔 이해하기 힘들었습니다 .ㅜㅜ

    혼란스러운 점이나, 틀린점을 댓글로 달아주시면 정말 감사하겠습니다 :)

Designed by Tistory.