개발콩블로그

[RxSwift] zip vs combineLatest 본문

RxSwift

[RxSwift] zip vs combineLatest

devBean 2025. 2. 18. 20:21

안녕하세요!

개발콩입니다. 오늘은 RxSwift operator 중 zip와 combineLatest에 대해서 소개하도록 하겠습니다.

 

 

Zip

zip은 여러 Observable의 방출을 지정된 함수로 결합하고, 각 결합에 대한 결과를 바탕으로 하나의 항목을 방출합니다.

값들이 동시에 방출되지 않아도 순차적으로 결합을 시도합니다.

 

 

예시 코드

let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<Int>()

Observable.zip(observable1, observable2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

obs1.onNext("A")  // 실행 X (observable2 값이 없음)
obs2.onNext(1)    // 실행 O ("A", 1)
obs2.onNext(2)    // 실행 X (observable1 값이 없음)
obs1.onNext("B")  // 실행 O ("B", 2)

 

 

CombineLatest

combineLatest는 여러 Observable 중 하나가 항목을 방출할 때마다,  각 Observable에서 방출된 최신 항목을 지정된 함수로 결합하여 방출합니다.

여러 Observable이 값을 방출해야만 결합을 시작하며, 그 이후에는 언제든 한쪽에서 값이 방출될 때마다 최신 값을 결합하여 방출합니다.

 

 

 

let observable1 = PublishSubject<String>()
let observable2 = PublishSubject<Int>()

Observable.combineLatest(observable1, observable2)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

obs1.onNext("A")  // 실행 X (observable2 값이 없음)
obs2.onNext(1)    // 실행 O ("A", 1)
obs2.onNext(2)    // 실행 O ("A", 2)
obs1.onNext("B")  // 실행 O ("B", 2)
obs1.onNext("C")  // 실행 O ("C", 2)

 

 

두 가지의 operator는 비슷한 역할을 수행하면서 차이가 존재합니다.

이러한 차이점을 알고 적절하게 사용하면 좋을 것 같습니다.

 

 

 

 

 

참고

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

https://reactivex.io/documentation/operators/combinelatest.html