728x90
반응형
1. FlatMap
방출된 항목의 값이 바뀌면 새로운 항목을 방출한다.
원본 옵저버블이 방출한 값을 감시해서 최신값을 확인할 수 있다.
옵저버블로 변환되고 값이 업데이트 될 때마다 새로운 항목을 방출한다.
모든 옵저버블이 방출하는 걸 모아서 -> 최종적으로 하나의 옵저버블(Result Observable)을 리턴한다.
네트워크 호출에 자주 쓰인다.
let redCircle = "🔴"
let greenCircle = "🟢"
let blueCircle = "🔵"
let redHeart = "❤️"
let greenHeart = "💚"
let blueHeart = "💙"
Observable.from([redCircle, greenCircle, blueCircle])
.flatMap { circle -> Observable<String> in
switch circle {
case redCircle:
return Observable.repeatElement(redHeart).take(5) // inner Observable
case greenCircle:
return Observable.repeatElement(greenHeart).take(5) // inner Observable
case blueCircle:
return Observable.repeatElement(blueHeart).take(5) // inner Observable
default:
return Observable.just("") // inner Observable
}
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
FlatMap=========================================
next(❤️)
next(❤️)
next(💚)
next(❤️)
next(💚)
next(💙)
next(❤️)
next(💚)
next(💙)
next(❤️)
next(💚)
next(💙)
next(💚)
next(💙)
next(💙)
completed
flatMap은 지연없이 방출돼서 순서없이 뒤죽박죽 방출되는데 이걸 Interleaving이라고 한다.
concatMap은 Interleaving을 허용하지 않아 순서를 지켜 방출한다는 점이 다름
2. FlatMapFirst
가장 먼저 이벤트를 방출한 이너 옵저버블에서만 이벤트를 방출하는 flatMapFirst
나머지 이너 옵저버블은 무시
- redCircle 이너 옵저버블의 이벤트만 사용하고 나머지는 무시
Observable.from([redCircle, greenCircle, blueCircle])
.flatMapFirst { circle -> Observable<String> in
switch circle {
case redCircle:
return Observable.repeatElement(redHeart).take(5) // inner Observable
case greenCircle:
return Observable.repeatElement(greenHeart).take(5) // inner Observable
case blueCircle:
return Observable.repeatElement(blueHeart).take(5) // inner Observable
default:
return Observable.just("") // inner Observable
}
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
FlatMapFirst=========================================
next(❤️)
next(❤️)
next(❤️)
next(❤️)
next(❤️)
completed
3. FlatMapLatest
가장 최근 이너 옵저버블에서만 이벤트를 방출
잘 모르겠음... 더 공부를 해봐야 알 거 같네...
728x90
반응형
'⭐️ 개발 > Rx' 카테고리의 다른 글
[Rx] Filtering Operator (0) | 2023.03.18 |
---|---|
[Rx] Create Operators (0) | 2023.03.17 |
[Rx] NSObject+Rx 라이브러리 (1) | 2023.01.18 |
[Rx Operator 시리즈] 3. Zip (0) | 2023.01.16 |
[Rx Operator 시리즈] 2. CombineLatest (0) | 2023.01.16 |