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 방출
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의 장점은
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://velog.io/@horeng2/Swift-RxSwift-map-flatMap의-차이점과-용도
share 연산자로 Observable 재사용하기 (0) | 2023.04.09 |
---|---|
scan Operator로 Observable 이전 값 활용하기 (0) | 2023.03.23 |
BehaviorSubject 개념 및 활용 (0) | 2023.03.18 |