점진적 과부하 개발 블로그

RxSwift Transforming Operator 본문

RxSwift

RxSwift Transforming Operator

지용빡 2022. 5. 18. 23:14
반응형
RxSwift Transforming Operator
toArray
  • Observable에 독립적인 요소들을 Array로 넣어준다.
print("-----toArray-----") // Observable에 독립적인 요소들을 Array로 넣어준다.
Observable.of("A", "B", "C")
    .toArray()
    .subscribe(onSuccess: {
        print($0)
    })
    .disposed(by: disposeBag)
map
  • Swift의 map과 같다. 
print("-----map-----") // Swift에 map과 같다.
Observable.of(Date())
    .map { date -> String in
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"
        dateFormatter.locale = Locale(identifier: "ko_KR")
        return dateFormatter.string(from: date)
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
flatMap
print("-----flatMap-----") //
protocol 선수 {
    var 점수: BehaviorSubject<Int> { get }
}

struct 양궁선수: 선수 {
    var 점수: BehaviorSubject<Int>
}

let 한국국가대표 = 양궁선수(점수: BehaviorSubject<Int>(value: 10))
let 일본국가대표 = 양궁선수(점수: BehaviorSubject<Int>(value: 9))

let 올림픽경기 = PublishSubject<선수>()

올림픽경기
    .flatMap { 선수 in
        선수.점수
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

올림픽경기.onNext(한국국가대표)
한국국가대표.점수.onNext(10)

올림픽경기.onNext(일본국가대표)
한국국가대표.점수.onNext(10)
일본국가대표.점수.onNext(8)
flatMapLatest
  • Observable Sequence의 각 요소들을 Observable Sequence들의 새로운 순서로 투영을 한 다음 Sequence 중에 가장 최근에 Sequence에서만 값을 생성한다. 
print("-----flatMapLatest-----") // Latest 가장 최신의 값을 확인하고 싶을 때 사용한다.
struct 높이뛰기선수: 선수 {
    var 점수: BehaviorSubject<Int>
}

let 서울 = 높이뛰기선수(점수: BehaviorSubject<Int>(value: 7))
let 제주 = 높이뛰기선수(점수: BehaviorSubject<Int>(value: 6))

let 전국체전 = PublishSubject<선수>()

전국체전
    .flatMapLatest { 선수 in
        선수.점수
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

전국체전.onNext(서울)
서울.점수.onNext(9)

전국체전.onNext(제주)
서울.점수.onNext(10)
제주.점수.onNext(8)
materialize and dematerialize 
print("-----materialize and dematerialize-----") //
enum 반칙: Error {
    case 부정출발
}

struct 달리기선수: 선수 {
    var 점수: BehaviorSubject<Int>
}

let 김토끼 = 달리기선수(점수: BehaviorSubject<Int>(value: 0))
let 박치타 = 달리기선수(점수: BehaviorSubject<Int>(value: 1))

let 달리기100M = BehaviorSubject<선수>(value: 김토끼)

달리기100M
    .flatMapLatest { 선수 in
        선수.점수
            .materialize() // 이벤트들을 함께 받을수 있다.
    }
    .filter {
        guard let error = $0.error else {
            return true
        }
        print(error)
        return false
    }
    .dematerialize() // 다시 원래의 상태로 되돌려준다.
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

김토끼.점수.onNext(1)
김토끼.점수.onError(반칙.부정출발)
김토끼.점수.onNext(2)

달리기100M.onNext(박치타)
print("-----전화번호 11자리-----")
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(10)
input.onNext(0)
input.onNext(nil)
input.onNext(1)
input.onNext(0)
input.onNext(1)
input.onNext(2)
input.onNext(nil)
input.onNext(3)
input.onNext(4)
input.onNext(1)
input.onNext(2)
input.onNext(3)
input.onNext(4)
반응형

'RxSwift' 카테고리의 다른 글

RxSwift TimeBased Operator  (0) 2022.05.22
RxSwift Combining Operator  (0) 2022.05.20
RxSwift Filtering Operator  (0) 2022.05.17
RxSwift Subject 알아보기  (0) 2022.05.16
RxSwift Single, Maybe, Completable 알아보기  (0) 2022.05.15