-
RxSwift - flatMapLatest에 대해서 알아보자.Ray Wenderlich/RxSwift 2018. 6. 12. 23:35
Ch7. Transforming Operators p.146 - p.151
지난 포스트에서는 flatMap에 대해서 알아보았다.
(flatMap포스트를 보지 않으면 아래 포스트를 이해하기 어려울 수 있습니다. flatMap은 링크)
이번엔 flatMap의 친구인 flatMapLatest에 대해서 알아보자.
flatMapLatest는 두 개의 Operator가 합쳐져 있다고 볼 수 있다.
flatMap과 switchLatest(뒤에 나올 예정)
switchLatest에 대해서는 나중에 다루겠지만, 간단히 알아보도록 하자.
switchLatest 또한 Observable in observable을 다루는데, 가장 최근에 추가된 시퀀스의 inner observable만 넘겨준다.
(원문: switchLatest will produce values from the most recent observable, and unsubscribe from the previous observable.)
즉, flatMapLatest는 가장 마지막으로 추가된 시퀀스의 inner observable이벤트만 subscribe하게 된다.
아오 발번역 죄송합니다.
(원문: flatMapLatest “Projects each element of an observable sequence into a new sequence of observable sequences and then transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.)
그림을 통해 살펴보면 이해가 쉬울 것이다.
1. flatMap과 마찬가지로, 01엘리먼트의 value에 해당하는 시퀀스가 생긴다. 01엘리먼트의 최초 value인 1에 10을 곱하여 최종 시퀀스로 전달된다.
2. 마찬가지로, 02엘리먼트의 value에 해당하는 시퀀스가 생긴다. 02엘리먼트의 최초 value인 2에 10을 곱한 값이 최종 시퀀스로 전달된다. 그 뒤에, 01엘리먼트의 value가 3으로 바뀌었나보다. 30이 전달된걸 보니...
하지만 최종 시퀀스에는 전달되지 않는다. 왜일까??
flatMapLatest는 가장 마지막으로 생성된 시퀀스. 즉 02엘리먼트에 해당하는 시퀀스의 value만 전달하기 때문이다.
(flatMapLatest는 실제로 01엘리먼트의 value에 10을 곱하여 30이라는 값을 만들어내지만, 무시된다.)
3. 03엘리먼트에 해당하는 시퀀스가 생겼고, 최초 value인 4에 10을 곱해 40이 전달되었다. 그 다음, 02엘리먼트의 value가 5로 바뀌어 50이 전달되었다. 하지만!! 가장 최근에 추가된 시퀀스는 03엘리먼트에 해당하는 시퀀스이기 때문에, 50은 최종 시퀀스에 전달되지 않는다.
그 뒤, 03엘리먼트의 value가 6이되어 60이 전달되었다. 03엘리먼트는 가장 최근에 생성된 시퀀스이기 때문에, 60은 최종 시퀀스로 전달된다.
코드를 통해 이해해보자.
우선 아래 코드는 Int타입 Subject를 갖는 Student를 선언한 것이다.
아래 코드를 실행하면 어떻게 로그가 찍힐까?
아래와 같이 찍힌다.
1에서 ryan의 score를 95로 바뀌었지만, 로그에는 찍히지 않았다.
왜일까?
마지막으로 student에 추가된 Student는 charlotte이기 때문이다.
flatMapLatest는 앞으로 charlotte에게 일어난 변화만 넘겨준다. ryan의 점수는 철저하게 무시하게 되는 것이다.
flatMap 대신 flatMapLatest를 사용하게 되는 경우는 어떤게 있을까?
네트워킹 기능에 대해서 생각해보자.
Imagine that you’re implementing a type-ahead search.
As the user types each letter, s, w, i, f, t, you’ll want to execute a new search and ignore results from the previous one. flatMapLatest is how you do that.
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - share(), share(replay:, scope:)에 대해서 알아보자 (2) 2018.06.24 RxSwift - materialize, dematerialize에 대해서 알아보자. (0) 2018.06.13 RxSwift - flatMap에 대해서 알아보자. (0) 2018.06.02 RxSwift - toArray에 대해서 알아보자. (0) 2018.05.22 RxSwift - throttle에 대해서 알아보자. (0) 2018.05.10