티스토리 뷰
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/
반응형
'🍏 > RxSwift' 카테고리의 다른 글
[RxSwift-Operator] Of와 From (0) | 2019.04.22 |
---|---|
[RxSwift-Operator] Map과 FlatMap (1) | 2019.04.22 |
[RxSwift] Publish/Behavior/Replay/Async Subject 비교 (1) | 2019.04.04 |
[RxSwift] Subject / Relay / Driver / Variable (2) | 2019.04.04 |
[RxSwift] Subject (0) | 2019.04.04 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Django FCM
- Flutter Clipboard
- DRF APIException
- Dart Factory
- Django Firebase Cloud Messaging
- SerializerMethodField
- drf custom error
- flutter deep link
- Python Type Hint
- 구글 Geocoding API
- Flutter Spacer
- 장고 URL querystring
- 장고 Custom Management Command
- METAL
- 플러터 얼럿
- ribs
- ipad multitasking
- Flutter 로딩
- 플러터 싱글톤
- Django Heroku Scheduler
- Flutter getter setter
- cocoapod
- Watch App for iOS App vs Watch App
- github actions
- flutter 앱 출시
- Sketch 누끼
- flutter dynamic link
- Flutter Text Gradient
- PencilKit
- flutter build mode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함