훌이
후리스콜링개발
훌이

블로그 메뉴

  • 왈 (iOS APP)
  • Github
전체 방문자
오늘
어제
  • 전체 (171)
    • ⭐️ 개발 (140)
      • JAVA (4)
      • Web (5)
      • iOS & Swift (94)
      • iOS Concurrency (4)
      • Rx (18)
      • Git (6)
      • WWDC (1)
      • Code Refactor (3)
      • Server (1)
    • ⭐️ Computer Science (22)
      • 운영체제 (10)
      • 네트워크 (5)
      • PS (7)
    • 경제시사상식 (8)
    • 기타 등등 (0)

인기 글

최근 글

05-17 21:53

티스토리

hELLO · Designed By 정상우.
훌이

후리스콜링개발

[Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest
⭐️ 개발/Rx

[Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest

2023. 1. 19. 18:12
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
    '⭐️ 개발/Rx' 카테고리의 다른 글
    • [Rx] Filtering Operator
    • [Rx] Create Operators
    • [Rx] NSObject+Rx 라이브러리
    • [Rx Operator 시리즈] 3. Zip
    훌이
    훌이

    티스토리툴바