fimuxd/RxSwift를 참고해 정리하는 글입니다 🙂
독립적인 Observable 요소를 Array로 묶는 방법
let disposeBag = DisposeBag()
Observable.of("A", "B", "C")
.toArray()
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// Prints:["A", "B", "C"]
각 항목에 함수를 적용하여 Observable이 방출하는 항목을 변환
let disposeBag = DisposeBag()
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
Observable<NSNumber>.of(123, 4, 56)
.map {
formatter.string(from: $0) ?? ""
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4, 5, 6)
.enumerated()
.map { index, interger in
index > 2 ? interger * 2 : interger
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/* Prints:
1 2 3 8 10 12
*/
struct Student {
var score: BehaviorSubject<Int>
}
let student = PublishSubject<Student>()
Observable이 방출하는 항목을 Observable로 변환한 다음 방출을 단일 Observable로 평탄화
여러 Observable Sequence에서 방출한 값을 하나의 Observable Sequence로 병합 방출
⇒ Observable의 방출을 병합하여 병합된 결과를 자체 시퀀스로 방출
let yeton = Student(score: BehaviorSubject(value: 80))
let groot = Student(score: BehaviorSubject(value: 90))
let student = PublishSubject<Student>()
student
.flatMap {
$0.score
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
student.onNext(yeton) // Printed: 80
yeton.score.onNext(85) // Printed: 80 85
student.onNext(groot) // Printed: 80 85 90
yeton.score.onNext(95) // Printed: 80 85 90 95
groot.score.onNext(100) // Printed: 80 85 90 95 100
flatMap
에서 가장 최신의 값만을 확인하고 싶을 때flatMapLatest
= map
+ switchLatest
switchLatest
: 가장 최근의 observable 에서 값을 생성하고 이전 observable을 구독 해제let yeton = Student(score: BehaviorSubject(value: 80))
let groot = Student(score: BehaviorSubject(value: 90))
let student = PublishSubject<Student>()
student
.flatMapLatest {
$0.score
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
student.onNext(yeton) // Printed: 80
yeton.score.onNext(85) // Printed: 80 85
student.onNext(groot) // Printed: 80 85 90
yeton.score.onNext(95)
groot.score.onNext(100) // Printed: 80 85 90 100
flatMapLatest
는 네트워킹 조작에서 가장 흔하게 사용observable
을 observable의 이벤트
로 변환let disposeBag = DisposeBag()
let yeton = Student(score: BehaviorSubject(value: 80))
let groot = Student(score: BehaviorSubject(value: 100))
let student = BehaviorSubject(value: yeton)
let studentScore = student
.flatMapLatest {
$0.score //.materialize()
}
studentScore
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
yeton.score.onNext(85)
yeton.score.onError(MyError.anError) // 종료
yeton.score.onNext(90)
student.onNext(groot)
studentScore
도 종료됨materialize
- 각각의 방출되는 이벤트를 이벤트의 observable로 만들 수 있다.dematerialize
- 기존의 모양으로 되돌려주는 역할