🍏/RxSwift
[RxSwift-Operator] FlatMap과 FlatMapLatest
eungding
2019. 4. 22. 00:02
728x90
반응형
시나리오
import RxSwift
import RxCocoa
let disposeBag = DisposeBag()
struct Student {
var score: BehaviorRelay<Int>
}
let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 95))
let student = PublishSubject<Student>()
score을 가지고 있는 Student 타입을 관찰하기 위해 student라는 subject를 만들었다
[ 1 ] FlatMap
student.flatMap { $0.score }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
student에서 score만 관찰해주고 싶어서 flatMap을 해주었다. flatMap 연산을 해주면 Observable<Int> 타입이 된다.
student.onNext(john)
75가 출력된다
john.score.accept(100)
john의 score을 바꿔줘도 score을 계속 관찰하고 있기때문에 100이 출력된다
student.onNext(mary)
mary.score.accept(80)
이렇게 해주면 95와 80이 출력된다
그 다음 john의 score을 바꿔준다면?!
john.score.accept(43)
43이 출력된다
즉, flatMap은 새로운 Observable을 관찰해도, 그 전에 관찰했던 Observable들을 계속 관찰한다.
[ 2 ] FlatMapLatest
반면 FlatMapLatest는 이름처럼, 오직 the latest observable만 관찰한다
student.flatMapLatest { $0.score }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
flatMap과 동일하게 flatMapLastest 연산을 해주면 Observable<Int> 타입이 된다
student.onNext(john)
john.score.accept(100)
75와 100이 출력된다
student.onNext(mary)
mary.score.accept(80)
the latest observable이 mary로 바뀌었다
95와 80이 출력된다
그 다음 john의 score을 바꿔준다면?!
john.score.accept(43)
아무것도 출력되지 않는다 더 이상 john을 관찰하지 않기 때문에 --!
mary.score.accept(85)
85가 출력된다 가장 최근의 옵져버블만 관찰함을 알 수 있다
==> flatMap과 flatMapLatest를 각각 필요한 조건에 따라 유용하게 쓸 수 있을 것 같다
Reference
https://www.udemy.com/mastering-rxswift-in-ios/
반응형