본문 바로가기

iOS/RxSwift

[Operators] Transforming

RxSwift의 Tranforming 연산자에 대한 정리 🚌 🚌 🚌

연산자 목차

- toArray

- map

- flatMap

- flatMapLatest

- buffer

 toArray 

element들을 배열로 묶어주는 연산자입니다.

1,2,3,4,5,6 -> [1,2,3,4,5,6] 으로 변형해줍니다. 

여기서 toArray는 Single타입을 반환해줍니다. Single은 오직 하나의 Element만 가지는 Observable입니다. 그렇기에 Single은 success, error 두가지 event를 처리해야 합니다. 나중에 다시 다루도록 하겠습니다.

Observable.of(1,2,3,4,5)
    .toArray()
    .subscribe(onSuccess: {
        print($0)
    }).disposed(by: disposeBag)

출력

// [1,2,3,4,5]

map

element들을 단순히 변형해주는 연산자입니다. 여기서 "변형"이 되는 방법은 두가지가 될 수 있습니다.

타입을 변형(○ → □)할 수도 있고 값을 변형(○ → ○ + 2) 해서 다음 스트림으로 넘겨줄수 있습니다. 

ex) ○ → □

var result: String = ""
Observable.of(1,2,3,4)
    .map { String($0) }
    .subscribe(onNext: {
        result.append($0)
        print(result)
    }).disposed(by: disposeBag)

출력 

// 1

// 12

// 123

// 1234

 

ex) ○ → ○ * 2

Observable.of(1,2,3,4)
    .map { $0 * 2 }
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

출력

// 2

// 4

// 6

// 8

flatmap

mapr과 비슷하게 동작할 것 같지만 조금 다르게 동작합니다.

방출되는 아이템에 대해 각자의 Sequence를 만들고 그것을 합쳐서 하나의 Sequence로 만들어줍니다. 

아래 그림은 flatmap에 대한 마블 다이어그램입니다. 하지만 더 헷갈리기만해서 인터넷에 찾아보니 이해하기 쉬운 그림이 나옵니다.

아래 그림을 보면 상단 Sequence(Observable)에서 방출한 아이템에 대해 Sequence를 각각 생성한 후, 다음 하나의 Sequence로 합쳐줍니다. 

출처: https://velog.io/@dev-yong/RxSwift-5.Operator-Transforming

struct Student {
    var score: BehaviorRelay<Int>
}

let student = PublishSubject<Student>()

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


let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 96))

student.onNext(john)

john.score.accept(100)

student.onNext(mary)

mary.score.accept(80)

출력

// 75

// 100

// 96

// 80

flatmapLatest

flatmap은 observable의 모든 element의 변화를 계속 관찰하고 있습니다. flatMapLatest는 예상한대로 가장 마지막 element의 변화만 관찰합니다. 

// ...

let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 96))

student.onNext(john)

john.score.accept(100)

student.onNext(mary)

john.score.accept(20)

출력

// 75

// 100

// 96

20은 mary Observable을 관찰하고 있기 떄문에 무시

Buffer

element 한걔씩 전달하는 것이 아니라 묶음으로 전달해주는 연산자입니다. 

마블 다이어그램을 보면 바로 이해할 수 있듯이 3으로 buffer size를 지정하면 3개의 elements를 묶어서 보내줍니다. 

Observable.of(1,2,3,4,5,6,7,8,9)
    .buffer(timeSpan: .seconds(2), count: 4, scheduler: MainScheduler.instance)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

 

출처: 

- https://reactivex.io/documentation/operators

- https://www.udemy.com/course/mastering-rxswift-in-ios/learn/lecture/

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

[Operators] Combining  (0) 2022.01.31
[Operators] Filtering  (0) 2022.01.30
[Observables] 개념  (0) 2021.05.14