Transforming Operator

김영민·2022년 3월 18일
0

1. toArray()

  • 배열로 만들어줌과 동시에 single로 만듦

2. map

  • swift와 동일한 기능의 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)

//출력 
//10
//9

4. flatMapLatest

  • (예를 들어) 2가지의 시퀀스를 가지고 있는 Observable에서, 새로운 sequence가 onNext 됐을 때,이전 sequence의 변경된 값은 무시한다.
  • 검색 자동완성에 사용가능.
  • 새로운 스트림을 만들고 동작을 수행하는 도중, 새로운 아이템이 방출되게 된다면, 이전 스트림을 dispose 하고 새롭게 들어오게 되는 아이템에 대해 스트림을 생성하여 동작.

스크린샷 2022-02-23 오후 12.42.49.png


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) //010-6676-2789
    .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)

//010-6676-2789

0개의 댓글