걍 가끔 헷갈려서 정리한다
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
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 |
댓글