[RxSwift] - Transforming Operator(Map, FlatMapLatest, FlatMap, ToArray)

sun02·2022년 2월 11일
0

RxSwift

목록 보기
5/12

1. Map

각 item에 함수를 적용하여 observable에서 방출하는 item을 변환합니다.

Observable.from([1,2,3])
    .map{ 10*$0 }
    .subscribe(onNext: {
        print($0)
    })

// 실행 시 다음을 출력합니다
10
20
30

2. ToArray

: Observable을 다른 객체나 데이터 구조로 변환합니다.

Observable.of("a","b","c")
    .toArray()
    .subscribe(onSuccess: {
        print($0)
    })
    .dispose(by: disposeBag)

// 실행 시 다음을 출력합니다
["a","b","c"]

  • toArray()는 observable을 Single로 변환하기 때문에 onNext가 아닌 onSuccess에서 출력합니다.

3. FlatMap

: observable이 방출한 항목을 observable로 변환한 다음 그 방출들을 단일 observable로 평면화 합니다.

FlatMap연산자는 소스 observable이 방출한 각 항목에
자체 함수를 적용하여 observable로 변환합니다.
여기서 함수는 자체적으로 항목을 내보내는 observable을 반환합니다.

이후 flatMap은 반환된 obsevable들을 병합하여 하나의 sequence로 방출합니다.

이 방법은 observable안에 observable이 있어 중첩되어 있을 때 유용합니다.

protocol player {
    var score: BehaviorSubject<Int> {get}
}

struct Archery: player {
    var score: BehaviorSubject<Int>
}

let korean = Archery(score: BehaviorSubject<Int>(value: 10))
let american = Archery(score: BehaviorSubject<Int>(value: 8))

let olympics = PublishSubject<player>()

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

olympics.onNext(korean)
korean.score.onNext(10)
olympics.onNext(american)
korean.score.onNext(10)
american.score.onNext(9)
  • FlatMap에 의해 olympic(publishSubject)안의 player.score(BehaviorSubject) 값에 접근할 수 있다.

// 실행 시 다음을 출력합니다.
10 // behaviourSubject이므로 구독시 초기값(10) 방출
10
8 // behaviourSubject이므로 구독시 초기값(8) 방출
10
9

+ FlatMapLatest

: map+ switchLatest의 역할을 합니다.

가장 최신의 observable sequence에서 값을 생성하는 observable sequence로 변환합니다.

struct Swim: player {
    var score: BehaviorSubject<Int>
}

let seoul = Swim(score: BehaviorSubject<Int>(value: 7))
let jeju = Swim(score: BehaviorSubject<Int>(value: 8))

let national = PublishSubject<player>()

national
    .flatMapLatest { player in
        player.score
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

national.onNext(seoul) // 1
seoul.score.onNext(9)  // 2

national.onNext(jeju)  // 3
seoul.score.onNext(3)  // 4
jeju.score.onNext(10)  // 5
jeju.score.onNext(2)

1, 2번에서 가장 최신의 observable sequence는 seoul이고
3번부터 가장 최신의 observable sequence는 jeju입니다.

따라서 4번의 seoul 값은 무시됩니다.

// 실행 시 다음을 출력합니다.
7 // seoul의 초기값
9 // 최신 sequence seoul의 값
8 // jeju의 초기값
10 // 최신 sequence jeju의 값
2 // 최신 sequence jeju의 값

참고자료 - ReactiveX

0개의 댓글