본문 바로가기
iOS/RxSwift

[RxSwift] map vs flatMap

by Jiseong 2022. 8. 9.

 

걍 가끔 헷갈려서 정리한다

map

Rx 공식문서에서 말하는 map은 다음과 같다.

각 항목에 함수를 적용하여 Observable에서 내보내는 항목을 변환합니다.

얘는 간단하다.

public func map<R>(_ transform: @escaping (Self.E) throws -> R) -> RxSwift.Observable<R>

Observable이 가진 요소들에 연산을 적용하고, 적용된 요소를 반환하는 것이다.

 

연산은 타입 변환도 해당되고, 단순한 값 연산도 해당이 되겠지

Observable<Person>
    .map { "\($0.name)" }
    .bind(to: nameLabel.rx.text)
    .disposed(by: disposeBag)

이런식으로 사용한다.

flatMap

Observable에 의해 방출된 항목을 Observable로 변환한 다음 그 방출을 단일 Observable로 평면화합니다.
public func flatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source) -> Observable<Source.Element>

 

위의 map의 경우엔 클로저 내부에서 요소, 단순한 값을 반환하지만, flatMap의 경우 Observable을 반환한다.

 

근데 얠 왜 쓸까?

 

자 생각해보자.. Observable을  map하는데, 매핑 로직 내부에서 반환하는 것이 단순한 요소, 값이 아닌 Observable을 반환한다면?

 

타입이 어떻게 될까? 평면화가 되지않기때문에...

Observable<Observable<Observable<Type>>>

이따구로 나온다.

 

이럴 때 flatMap을 사용하여 평면화를 진행하는 것이다.

 

아 그리고 애초에 보통 상황엔 flatMap이 아닌 map 내부에서 Observable을 리턴하지 않는다.

 

아래와 같은 상황에서 사용한다.

yourButton.rx.tap
    .asObservable()
    .flatMap { _ -> Observable<[String]> in
        return fetchAllAnswers()
    }
    .subscribe { stringArray in 
        items.value = stringArray
    }
    .disposed(by:bag)

https://stackoverflow.com/questions/36838248/rxswift-how-to-recall-an-api

 

RXSwift - How to recall an api

i created an observable for an api call and bind to a tableview. Now i am unclear how to call the same api once again? so as to do a refresh - say on an button click?. The following is my sample co...

stackoverflow.com

 

fetchAllAnswers을 호출하고 해당 메서드가 반환할 Observable<[String]>으로 변환해주는 것이다.

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

[RxSwift] flatMapLatest (feat. flatMap)  (1) 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

댓글