본문 바로가기
iOS/RxSwift

[RxSwift] flatMapLatest (feat. flatMap)

by Jiseong 2022. 8. 9.

 

2022.08.09 - [iOS/RxSwift] - [RxSwift] map vs flatMap

 

[RxSwift] map vs flatMap

걍 가끔 헷갈려서 정리한다 map Rx 공식문서에서 말하는 map은 다음과 같다. 각 항목에 함수를 적용하여 Observable에서 내보내는 항목을 변환합니다. 얘는 간단하다. public func map (_ transform: @escaping..

limjs-dev.tistory.com

 

flatMap 보고오십쇼

 

flatMap과 비교하며 알아보자

flatMap

example(of: "flatMap") {
     let disposeBag = DisposeBag()
     
     // 1
     let ryan = Student(score: BehaviorSubject(value: 80))
     let charlotte = Student(score: BehaviorSubject(value: 90))
     
     // 2
     let student = PublishSubject<Student>()
     
     // 3
     student
         .flatMap{
             $0.score
         }
         // 4
         .subscribe(onNext: {
             print($0)
         })
         .disposed(by: disposeBag)
     
     // 5
     student.onNext(ryan)    // Printed: 80
     
     // 6
     ryan.score.onNext(85)   // Printed: 80 85
     
     // 7
     student.onNext(charlotte)   // Printed: 80 85 90
     
     // 8
     ryan.score.onNext(95)   // Printed: 80 85 90 95
     
     // 9
     charlotte.score.onNext(100) // Printed: 80 85 90 95 100
 }

flatMap은 하나의 Observable(시퀀스)에서 발생하는 Event에 대한 Observable을 새로 생성하고, 생성된 것들을 최종적으로 하나의 Observable로 합쳐주도록 동작한다.

 

생성된 모든 Observable들을 최종적으로 하나의 Observable로 합쳐준다는 것을 보면.. 모든 Observable에서 발생하는 이벤트를 전부 관찰한다는 것을 알 수 있다.

 

실제로도 그렇다. 

 

해당 코드를 marble형태로 그려보면 아래와 같다.

student: —----r-------c—-
ryan:       --80--85----95--
charlotte:         --90----100--
result:  ----—80--85-90-95-100--

즉, flatMap은 각 Observable의 이벤트를 계속 지켜본다.

flatMapLatests

flatMap에서 발생하는 이벤트중 최신의 이벤트만 받고 싶을 때 flatMapLatest를 사용할 수 있다.

example(of: "flatMapLatest") {
     let disposeBag = DisposeBag()
     
     let ryan = Student(score: BehaviorSubject(value: 80))
     let charlotte = Student(score: BehaviorSubject(value: 90))
     
     let student = PublishSubject<Student>()
     
     student
         .flatMapLatest {
             $0.score
     }
         .subscribe(onNext: {
             print($0)
         })
         .disposed(by: disposeBag)
     
     student.onNext(ryan)
     ryan.score.onNext(85)
     
     student.onNext(charlotte)
     
     // 1
     ryan.score.onNext(95)
     charlotte.score.onNext(100)
     
     /* Prints:
     	80 85 90 100
     */
 }

새로운 Observable(Sequence)이 생성되면 앞전거 버리고 새로운것만 관찰하는 것이다.

 

코드를 보면 80 85까진 flatMap과 동일하게 이벤트를 내려주는 것을 볼 수 있다.

 

하지만 charlotte이라는 새로운 Sequence가 생성되고, ryan에 이벤트를 보내게되면 해당 이벤트는 무시된다.

 

왜? charlotte이라는 새로운(최신의, Latest) Observable이 생겼으므로 이전의 Observable의 이벤트는 전부 무시되는 것이다.

 

그럼 언제 사용하는 것이 좋을까?

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.

 

사용자가 각 문자 s, w, i, f, t를 입력할 때 새 검색을 실행하고 이전 검색의 결과를 무시하고 싶을 것이다...?

 

이 말이 뭐냐? 뭘 검색하는 상황이라고 생각해보자.

 

swift에 대한 검색 결과를 알고싶은 것이지 이전 검색 결과인 s, sw, swi, swit에 대한 검색 결과(값)을 알고싶은 것이 아니다.

 

이럴 때 가장 최근에 생성된 Observable의 값만 받기위해 flatMapLatest를 사용할 수 있을 것이다.


https://github.com/fimuxd/RxSwift/blob/master/Lectures/07_Transforming%20Operators/CH7_TransformingOperators.md

 

GitHub - fimuxd/RxSwift: RxSwift를 스터디하는 공간

RxSwift를 스터디하는 공간. Contribute to fimuxd/RxSwift development by creating an account on GitHub.

github.com

 

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] map vs flatMap  (0) 2022.08.09
[RxSwift] RxDataSources 사용해보기  (0) 2022.08.02
[RxSwift] concat  (3) 2022.07.26
[RxSwift] Hot vs Cold Observable  (0) 2022.06.08
[RxSwift] Observable, Dispose  (0) 2022.03.20

댓글