각 item에 함수를 적용하여 observable에서 방출하는 item을 변환합니다.
Observable.from([1,2,3])
.map{ 10*$0 }
.subscribe(onNext: {
print($0)
})
// 실행 시 다음을 출력합니다
10
20
30
: Observable을 다른 객체나 데이터 구조로 변환합니다.
Observable.of("a","b","c")
.toArray()
.subscribe(onSuccess: {
print($0)
})
.dispose(by: disposeBag)
// 실행 시 다음을 출력합니다
["a","b","c"]
: 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)
// 실행 시 다음을 출력합니다.
10 // behaviourSubject이므로 구독시 초기값(10) 방출
10
8 // behaviourSubject이므로 구독시 초기값(8) 방출
10
9
: 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의 값