ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - materialize, dematerialize에 대해서 알아보자.
    Ray Wenderlich/RxSwift 2018. 6. 13. 23:45

    Observing events p.151 - p155

    flatMap(링크), flatMapLatest(링크)에서 이어지는 포스트입니다.


    도입부 해석을 잘 못하겠음.. 원문 첨부하고 코드로 이해하기.

    There may be times when you want to convert an observable into an observable of its events. One typical scenario where this is useful is when you do not have control over an observable that has observable properties, and you want to handle error events to avoid terminating outer sequences.


    1. Error를 하나 만들었다.

    2. Student의 인스턴스를 두개 만들어, Student타입의 Subject를 생성했다. BehaviorSubject는 초기값 1를 갖고 있어야 하기 때문에, ryan으로 초기화하였다.


    각 Student인스턴스의 score를 subscribe하고 싶은 상황이다.

    그래서 아래코드를 작성했다. (flatMap, flatMapLatest에서 사용한 예제와 유사하다.)

    1. studentScore라는 시퀀스를 만든다. 이 시퀀스에는 student의 score가 기록된다.

    2. studentScore에서 발생하는 이벤트를 로그로 남기고 있다.

    3. 새로운 score이벤트, error이벤트 그리고 다시 score이벤트를 발생시킨다.

    4. student에 새로운 Student인 charlotte을 전달한다.


    error이벤트를 따로 처리해주지 않았기 때문에, student시퀀스가 종료되고, studentScore시퀀스도 종료된다. 따라서 이 코드의 결과는 아래와 같다.

    (This error is unhandled. As a result, the studentScore observable terminates, as does the outer student observable.)


    materialize를 사용하여, observable in observable을 감싸줄 수 있다.

    그림과 코드로 보자면 아래와 같다.


    코드로 보니 뭐 별반 다를게 없어보인다.

    하지만 이렇게 선언하면, studentScore의 타입은 Observable<Event<Int>>가 된다.  ([Opt]-[Click]으로 확인가능)

    따라서, 이를 subscribe하는 것은 Int가 아닌 Event에 대한 subscribe가 되는 것이다.


    이렇게 되면, 단순히 error이벤트가 전달되기 때문에, score프로퍼티가 문제없이 전달된다.

    아래 코드처럼 말이다.


    그럼 이런 기능을 사용하면서, Event가 아닌 Int를 subscribe하고 싶다면 어떻게 해야할까?

    즉, next(80)이 아닌 80을 전달받고 싶다면??

    dematerialize가 바로 이를 위한 Operator다. dematerialize는 materialize된 이벤트를 원래의 타입으로 변형시켜준다.


    코드를 통해 살펴보자.

    1. error이벤트를 필터하여 걸러준다.

    2. studentScore에 전달된 Event타입을 원래의 타입(여기선 Int)으로 변경시켜준다.


    실행 결과, 로그는 아래와 찍히게 된다.


Designed by Tistory.