상세 컨텐츠

본문 제목

Transforming Operators - Map, FlatMap, FlatMapLatest

iOS/RxSwift

by 쑤야. 2023. 3. 17. 22:39

본문

Map

transform the items emitted by an Observable by applying a function to each item

 

 

 

Swift의 고차함수인 map과 동일하게 생각할 수 있다.

 

각 요소들에 대해서 클로저 연산을 수행해 방출하는 것이다.

 

Observable<Int>
	.of(1, 2, 3)
	.map{ $0 * 2 }

//2 4 6 방출

FlatMap

transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable

FlatMap merges the emissions of resulting Observables, emitting these merged results as its own sequence.

 

func flatMapTest(){
    
    struct Student {
        var score: BehaviorSubject<Int>
    }
    
    let disposeBag = DisposeBag()
    
    let ryan = Student(score: BehaviorSubject(value: 80))
    let charlotte = Student(score: BehaviorSubject(value: 90))

    let student = PublishSubject<Student>()

    student
        .flatMap{
            $0.score
        }
        .subscribe(onNext: {
            print($0)
        })
        .disposed(by: disposeBag)

    student.onNext(ryan)    

    ryan.score.onNext(85)   

    student.onNext(charlotte)   

    ryan.score.onNext(95) 

    charlotte.score.onNext(100) 

		// Printed: 80 85 90 95 100
}

observable 값을 방출하는 역할은 student라는 PublishSubject가 담당하고 있다.

 

처음 student에 ryan 학생의 점수가 구독된다

다음 charlotte 학생이 구독된다

 

이때 charlotte이 구독되어도, ryan의 점수 또한 계속해서 관찰되고 있는 것이다.

 

여러 스트림이 구독되어도 각 스트림을 병합해 평면 스트림으로 만들며, 모든 스트림에 대해서 값을 계속 관찰해나가는 것

이게 flatMap의 역할!!

 

즉, 관찰하는 observable을 추가했다고 볼 수 있다.

 

FlatMap의 장점은

  1.  한 번에 여러 스트림을 사용할 수 있음
  2. 여러 스트림에서 방출된 아이템에 대해 누락 없이 구독 가능

FlatMapLatest

FlatMap 중 가장 최근의 스트림을 관찰할 때 사용

func flatMapLatestTest(){
    
    let disposeBag = DisposeBag()
    
    let ryan = Student(score: BehaviorSubject(value: 80))
    let charlotte = Student(score: BehaviorSubject(value: 90))
    
    let student = PublishSubject<Student>()
    
    student
        .flatMapLatest {
            $0.score
        }
        .subscribe(onNext: {
            print($0)
        })
        .disposed(by: disposeBag)
    
    student.onNext(ryan)
    ryan.score.onNext(85)
    
    student.onNext(charlotte)
    
    ryan.score.onNext(95)
    charlotte.score.onNext(100)
    
    //80 85 90 100
}

flatMap은 student가 ryan과 charlotte의 값 모두를 관찰했다

하지만 flatMapLatest는 student 스트림이 charlotte로 변경되면서 ryan의 값은 더 이상 방출하지 않는다


즉, 관찰하는 observable을전환했다고 볼 수 있다.

@참고

https://github.com/fimuxd/RxSwift/blob/master/Lectures/07_Transforming%20Operators/CH7_TransformingOperators.md

 

GitHub - fimuxd/RxSwift: RxSwift를 스터디하는 공간

RxSwift를 스터디하는 공간. Contribute to fimuxd/RxSwift development by creating an account on GitHub.

github.com

https://velog.io/@horeng2/Swift-RxSwift-map-flatMap의-차이점과-용도

 

[Swift] RxSwift - map, flatMap의 차이점과 용도

RxSwift를 이용한 연습 프로젝트를 진행하면서종종 두뇌 CPU 사용량 초과로 뇌정지가 왔는데 😵‍💫그럴 때 가장 자주 헤맸던 부분이 map과 flatMap의 사용이었다.이번 프로젝트에서 subcribe전까지의

velog.io

 

관련글 더보기