본문 바로가기
RxSwift

[RxSwift] Transforming Operators

by thoonk: 2022. 1. 2.
반응형

Transforming Operators 에 관해 정리한 내용을 기록합니다.

 

Transforming Operators 

 

toArray

 

Observable을 다른 객체 또는 자료 구조로 변환한다.

 

Observable.of(1,2,3,4)
    .toArray()
    .subscribe(onSuccess: {
        print($0)
    })
    .disposed(by: bag)
    
    // [1,2,3,4]

 

map

Observable에서 방출된 각각의 요소를 원하는 함수를 적용하여 변환한다.

기존 map과 동일하게 작동하고 Observable에서 동작한다는 점이 다르다.

 

Observable.range(start: 1, count: 3)
    .map { $0 * $0 }
    .subscribe(onNext: {
        print($0, terminator: " ")
    })
    .disposed(by: bag)

// 1 4 9

 

enumerated 

방출된 요소의 index를 확인하고 싶을 때 사용한다.

 

Observable.of(1,2,3,4,5)
    .enumerated()
    .map { index, value in
        if index > 2 {
            return 2 * value
        } else {
            return value
        }
    }
    .subscribe(onNext: {
        print($0, terminator: " ")
    })
    .disposed(by: bag)

// 1 2 3 8 10

 

flatMap

 

Observable에서 방출된 각각의 요소를 Observable로 변환하고 이들을 결합하여 하나의 새로운 Observable로 만들어 방출한다.

 

let sequenceInt = Observable.range(start: 1, count: 3)
let sequenceAlpha = Observable.of("A", "B", "C")

sequenceInt
    .flatMap { (n: Int) -> Observable<String> in
        return sequenceAlpha.map { "\(n): \($0)"}
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: bag)

/*
1: A
1: B
2: A
1: C
2: B
3: A
2: C
3: B
3: C
*/

sequenceInt와 sequnceAlpha 두 개의 Observable을 하나의 시퀀스로 평평(flat)하게 방출된다.

 

flatMapFirst

flatMap과 유사하게 동작하지만 먼저 생성된 시퀀스의 동작이 다 끝날 때까지 새로 방출되는 요소들은 무시된다.

 

sequenceInt
    .flatMapFirst{ (n: Int) -> Observable<String> in
        return sequenceAlpha.map { "\(n): \($0)" }
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: bag)

/*
1: A
1: B
1: C
*/

‘1’에 대한 첫번째 스트림일 때 위 출력 결과와 같이 다른 스트림은 무시되는 것을 확인할 수 있다.

 

flatMapLatest

새로운 시퀀스를 생성하여 동작하는 중에 새로운 요소가 방출되게 된다면 이전 시퀀스를 dispose하고 새롭게 들어오는 요소에 대한 시퀀스를 생성하여 동작한다.

가장 최신의 값이 필요할 때 주로 사용한다. (e.g. Networking, Searching)

 

sequenceInt
    .flatMapLatest { (n: Int) -> Observable<String> in
        return sequenceAlpha.map { "\(n): \($0)" }
    }
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: bag)

/*
 1: A
 2: A
 3: A
 3: B
 3: C
 */

기존의 시퀀스를 dispose하고 새로운 요소에 대한 시퀀스를 생성하여 방출하는 것을 확인할 수 있다.

 

부족한 점 피드백해주시면 감사합니다👍

반응형

'RxSwift' 카테고리의 다른 글

[RxSwift] Extension Reactive  (0) 2022.07.14
[RxSwift] Combining Operators  (0) 2022.05.26
[RxSwift] Filtering Operators (Taking)  (0) 2022.01.01
[RxSwift] Filtering Operators (Skipping)  (0) 2021.05.11
[RxSwift] Filtering Operators (Ignoring)  (0) 2021.05.11

댓글