RxSwift

RxSwift - Zip

GREEN.1229 2021. 10. 13. 20:12

안녕하세요. 그린입니다🟢

이번 포스팅에서는 RxSwift의 Zip에 대해 학습해보겠습니다💁🏻

 

이전에 CombineLatest에 대해서 학습해본적이 있습니다.
그때 CombineLatest는 두가지의 옵저버블 방출을 통해 합쳐서 보내준다는점에선 Zip과 동일합니다.
다만 CombineLatest는 합성 후 그다음 다른 옵저버블의 방출이 들어온다면 또 합성하여 뿌려주는 특성이 있었습니다.
그러면 Zip은 어떻게 다른건지 알아보시죠🧐

Zip

Zip이란?

정의한 함수를 통해 여러 Observable의 방출을 결합하여 이 조합에 의해 단일 항목으로 방출해줍니다.

아래 그림과 같은 플로우입니다.

Zip

자 위 플로우를 보면 첫번째 옵저버블의 흐름에서는 1,2,3,4,5가 방출되고

두번째는 A,B,C,D가 방출됩니다.

여기서 CombineLatest였다면 1A, 2A, 2B, 2C, 2D, 3D, 4D, 5D 이런식으로 새로운 옵저버블이 방출될때마다

조합하여 항목을 뱉어냈습니다.

그러나 Zip은 그와 달리 순서대로 짝을지어 방출하게됩니다.

즉 5개, 4개의 이벤트가 방출되면 순서대로 쌍을 이뤄 총 4개의 항목이 방출되는 형식입니다.

 

Zip의 선언 및 사용

import RxSwift

let nameObservable = Observable.of("green", "red", "blue", "white")
let ageObservable = Observable.of(10, 20, 30, 40, 50)
let disposeBag = DisposeBag()

let PersonObservable = Observable
  .zip(nameObservable, ageObservable)
  .subscribe(onNext: { 
    print($0 + "\($1)") 
  })
  .disposed(by: disposeBag)
    
// Output
green 10
red 20
blue 30
white 40

이렇게 옵저버블을 조합하여 하나의 쌍으로 방출할 수 있습니다.

계속 말했듯 중요한 차이는 발생 순서가 같은 이벤트들만 조합하여 발생시킵니다.

발생 순서가 다르면 조합하지 않습니다.

 

자 이렇게 간단히 Zip에 대해 알아봤습니다.
RxSwift를 쓰면서 참...
옵저버블의 조합하는 방식이 되게 많죠?
concat, merge, combineLatest 그리고 오늘배운 Zip까지도😅
이게 다 리액티브한 뷰의 변화를 주기 위함의 노력이라고 생각합니다.
아직은 서툴지만 특징들을 잘 기억해서 적재적소에 써보자구요🔥

 

[참고자료]

http://reactivex.io/documentation/operators/zip.html

 

ReactiveX - Zip operator

RxJS implements this operator as zip and zipArray. zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces

reactivex.io