관리 메뉴

김종권의 iOS 앱 개발 알아가기

[RxSwift] 3. flatMap / flatMapFirst / flatMapLatest 본문

RxSwift/RxSwift 응용

[RxSwift] 3. flatMap / flatMapFirst / flatMapLatest

jake-kim 2020. 9. 27. 00:54

1. flatMap

- Observable관련 이벤트를 받아서, 새로운 Observable 방출

let sequenceInt = Observable.of(1, 2, 3)	
let sequenceString = Observable.of("A", "B", "C", "D")

sequenceInt
	.flatMap { (x: Int) -> Observable<String> in
		print("Emit Int Item : \(x)")
		return sequenceString
	}
	.subscribeNext {
		print("Emit String Item : \($0)")
}

// Output
Emit Int Item : 1
Emit String Item : A
Emit String Item : B
Emit String Item : C
Emit String Item : D
Emit Int Item : 2
Emit String Item : A
Emit String Item : B
Emit String Item : C
Emit String Item : D
Emit Int Item : 3
Emit String Item : A
Emit String Item : B
Emit String Item : C
Emit String Item : D

2. flatMapFirst

이전에  생성한 Observable의 동작이 다 끝날 때까지 새로 생성한 Observable무시

 

3. flatMapLatest

flatMapFirst와 반대로, Observable이 새로 들어오면 예전것을 dispose시키고 새로운 것을 이용

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
   .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이므로 ryan에 이벤트는 무시
charlotte.score.onNext(100)

/* Prints:
 80 
 85 
 90 
 100
*/

 

Comments