1. toArray()
2. map
3. flatMap
- 중첩된 Observable에서 내부의 값을 컨트롤하고 싶을 때 사용
let disposeBag = DisposeBag()
protocol 선수 {
var 점수 : BehaviorSubject<Int> { get }
}
struct 양궁선수 : 선수 {
var 점수 : BehaviorSubject<Int>
}
let 한국양궁선수 = 양궁선수(점수: BehaviorSubject<Int>(value: 10))
let 미국양궁선수 = 양궁선수(점수: BehaviorSubject<Int>(value: 8))
let 올림픽경기 = PublishSubject<선수>()
올림픽경기
.flatMap{선수 in
선수.점수
}
.subscribe(onNext:{
print($0)
})
.disposed(by: disposeBag)
print("한국양궁선수 초기값")
올림픽경기.onNext(한국양궁선수)
print("한국양궁선수 다음 값")
한국양궁선수.점수.onNext(9)
4. flatMapLatest
- (예를 들어) 2가지의 시퀀스를 가지고 있는 Observable에서, 새로운 sequence가 onNext 됐을 때,이전 sequence의 변경된 값은 무시한다.
- 검색 자동완성에 사용가능.
- 새로운 스트림을 만들고 동작을 수행하는 도중, 새로운 아이템이 방출되게 된다면, 이전 스트림을 dispose 하고 새롭게 들어오게 되는 아이템에 대해 스트림을 생성하여 동작.
5. materialize
- 값과 동시에 이벤트를 받을 수 있음 ( next(),error() 등 )
6. dematerialize
전화번호 입력 코드 예시 ( 종합 연습 )
let disposeBag = DisposeBag()
let input = PublishSubject<Int?>()
let list: [Int] = [1]
input
.flatMap{
$0 == nil ? Observable.empty() : Observable.just($0)
}
.map{ $0! }
.skip(while: {$0 != 0})
.take(11)
.toArray()
.asObservable()
.map {
$0.map {"\($0)"}
}
.map { numbers in
var numberList = numbers
numberList.insert("-", at: 3)
numberList.insert("-", at: 8)
let number = numberList.reduce(" ",+)
return number
}
.subscribe(onNext:{
print($0)
})
.disposed(by: disposeBag)
input.onNext(0)
input.onNext(1)
input.onNext(0)
input.onNext(6)
input.onNext(6)
input.onNext(7)
input.onNext(6)
input.onNext(2)
input.onNext(7)
input.onNext(8)
input.onNext(9)