티스토리 뷰

반응형

시나리오 

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 비교  (0) 2019.04.04
[RxSwift] Subject / Relay / Driver / Variable  (2) 2019.04.04
[RxSwift] Subject  (0) 2019.04.04
댓글