iOS/RxSwift

[RxSwift] Transforming Operator(ToArray, Map, FlatMap, FlatMapLatest)

Chafle 2022. 11. 1. 10:11
반응형

ToArray

Map

FlatMap

FlatMapLatest

 

 

변환 연산자를 쓰는 목적

 

Obervable data를 새로운 sequence로 변경하고

원하는 sequece로 변환 시키기 위해서 사용한다.

 

다른 말로 

간단히 데이터를 변형시켜 다른 데이터로 만듦


 

ToArray

 

각각의 배열요소를 array형태로 만든다.

 

  Observable.of(1,2,3,4,5)

    .toArray()
    .subscribe({
      print($0)
    })
    .disposed(by: disposeBag)

 

 

 

element를 Array로 변환한 것을 볼 수 있다.

() -> []

 

 


 

Map

 

기본적으로 map {주어진 식}

표현으로 표기되는데

 

map은 주어진 식을 통해 새로운 sequence를 만든다.

 

 

  Observable.of(1,2,3,4,5)

    .map { return $0 * 2 }
    .subscribe(onNext: {
      print($0)
    }).disposed(by: disposeBag)

 

반응형

 


 

 

FlatMap

 

이해하기 어려울 수 있는데

 

기존에 있던 sequece가 flatmap을 만나서 변환이 되는데

변환이후의 것들을 newsequence로 형성한다(변경되는 값을 추적할 수 있다.)

 

예로 이해를 해보면

 

let disposeBag = DisposeBag()

struct Student {
    var score: BehaviorRelay<Int>
}

let chassi = Student(score: BehaviorRelay(value: 90))
let young = Student(score: BehaviorRelay(value: 20))
let ming = Student(score: BehaviorRelay(value: 50))


let student = PublishSubject<Student>()

student.asObservable()
    .flatMap { $0.score.asObservable() } 
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)


student.onNext(chassi)

 

여기서 추측해 볼수 있는 값은 chassi의 값을 추출하는 것인데 90

 

 

추가로 위 값들을 변경하는 메서드를 진행해보면

chassi.score.accept(91)

student.onNext(ming)
ming.score.accept(10)

chassi.score.accept(100)

 

chassi는 90이후로 변경된 값 91,

 

ming은 50->10으로 변경되고

마지막으로 다시 chassi를 100으로 변경한 값을

그대로 추적하는 것을 볼 수 있다.

 

 


FlatMapLatest

 

 

마지막에(가장 최근에) FlatMapLatest로 추적한 sequnce만 추적한다.

 

 

위와 동일한 코드인데 flatMapLatest로 변경했다.

import UIKit
import RxSwift
import RxCocoa

let disposeBag = DisposeBag()

struct Student {
    var score: BehaviorRelay<Int>
}

let chassi = Student(score: BehaviorRelay(value: 90))
let young = Student(score: BehaviorRelay(value: 20))
let ming = Student(score: BehaviorRelay(value: 50))

let student = PublishSubject<Student>()

student.asObservable()
    .flatMapLatest { $0.score.asObservable() } 
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

student.onNext(chassi) // 시퀀스 생성
chassi.score.accept(100) // 시퀀스 추적가능

student.onNext(young) // 시퀀스 변경
chassi.score.accept(10) // 마지막에대해서만 반응

chassi에 대해서 처음 sequence생성된 값 90->100은 추적 가능하지만

시퀀스가 새롭게 young으로 추가되고 다시 chassi에 대한 값을 추적하면 추적이 불가능하다.

마지막에 들어온 sequence에 대해서만 반응하므로, young이 추적가능하다.

 

 

반응형

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Combining Operators  (1) 2022.11.02
[RxSwift] Filtering Operator  (0) 2022.10.27
[RxSwift] Subject에 관하여  (0) 2022.10.25
[RxSwift] Observable, Dispose, Create로 subscribe하기  (0) 2022.10.25