안녕하세요, iOS 개발하는 루피입니다.
Map 과 FlatMap은 주로 Observable이 배출한 아이템들을 변환하는데 사용하는 Operator들 이다.
Map : Observable이 배출한 항목에 함수를 적용한다.

Map 연산자는 Source Observable이 방출하는 각 아이템에 사용자가 선택한 함수를 적용하고, 그 함수의 적용 결과를 방출하는 새로운 Observable을 반환합니다. 이때, Source Observable은 원본 데이터를 방출하는 주체를 의미한다. 쉽게 말해서는 가장 처음에 데이터를 방출하는 Observable 이라고 생각하면 됩니다.
예를 들어 코드를 살펴 보면,
Observable.of(1, 2, 3)
.map { $0 * 2 }
.subscribe(onNext: { print($0) })
여기서 Observable.of(1, 2, 3)이 "소스 Observable"입니다. 이 Observable이 1, 2, 3이라는 값을 방출하며, 그 다음 map 연산자를 통해 각 값이 두 배로 변환되어 최종적으로 2, 4, 6이 출력됩니다.
FlatMap : 하나의 Observable이 방출하는 아이템들을 여러개의 Observable로 변환하고, 이 변환된 Observable이 방출하는 아이템들을 차례차례 줄 세워 하나의 Observable로 전달한다.

FlatMap 연산자는 소스 Observable이 방출하는 각 아이템에 대해 사용자가 지정한 함수를 적용하여 Observable로 변환하고, 그 결과로 만들어진 Observable들이 방출하는 아이템들을 병합하여 자신의 시퀀스로 방출하는 연산자입니다.
예를 들어 코드를 살펴 보면,
import RxSwift
let disposeBag = DisposeBag()
// 소스 Observable
let numbers = Observable.of(1, 2, 3)
// flatMap을 사용하여 각 아이템을 Observable로 변환하고, 결과를 하나의 Observable로 합침
numbers
.flatMap { number in
return Observable.of("Transformed \(number)")
}
.subscribe(onNext: { value in
print(value)
})
.disposed(by: disposeBag)
// Transformed 1
// Transformed 2
// Transformed 3
단, FlatMap은 이러한 Observable들이 방출하는 아이템들을 병합하여 방출하기 때문에, 각 Observable에서 방출된 아이템들이 섞일 수 있다는 점을 유의해야 합니다.
예를 들어 코드를 살펴 보면,
import RxSwift
let disposeBag = DisposeBag()
// 소스 Observable
let source = Observable.of(1, 2, 3)
source
.flatMap { number -> Observable<String> in
// 각 아이템을 Observable로 변환 (delay를 통해 순서 섞임을 확인)
let delay = Double.random(in: 0.1...0.5)
return Observable.just("Transformed \(number)")
.delay(.milliseconds(Int(delay * 1000)), scheduler: MainScheduler.instance)
}
.subscribe(onNext: { value in
print(value)
})
.disposed(by: disposeBag)
// Transformed 2
// Transformed 1
// Transformed 3
이럴때 순서를 보장하고 싶다면, ConcatMap 을 사용하면 순서대로 방출하도록 보장한다.
이렇게 마무리하도록 하겠습니다. 피드백은 언제나 환영입니다!
'iOS > RxSwift' 카테고리의 다른 글
| [RxSwift] Empty / Never / Throw (0) | 2024.12.20 |
|---|---|
| [RxSwift] Create / Defer (1) | 2024.12.20 |
| [RxSwift] Subject (0) | 2024.12.20 |
| [RxSwift] Observable (0) | 2024.12.20 |
| [RxSwift] RxSwift를 왜 쓰는걸까? 효율적인 비동기 (0) | 2024.12.20 |