[RxSwift] zip, combineLate

2025. 1. 9. 22:14iOS

반응형

RxSwift에서 zip과 combineLatest는 둘 다 여러 Observable을 결합하여 데이터를 처리하는 데 사용되지만, 작동 방식과 사용 시점에서 차이가 있습니다. 아래에 두 연산자를 자세히 설명하겠습니다.


1. Observable.zip

zip은 두 개 이상의 Observable이 각각 값을 방출할 때, 동일한 인덱스의 값들을 결합합니다. 각 Observable이 모두 값을 방출해야 결합이 이루어지며, 결합된 값은 튜플 형태로 전달됩니다.

특징

  • 순서 기반: 각 Observable의 방출 값이 동일한 인덱스일 때만 결합.
  • 가장 짧은 Observable이 완료되면 zip도 완료.
  • 병렬 처리에 적합.

사용 예시

let observable1 = Observable.of(1, 2, 3) 
let observable2 = Observable.of("A", "B", "C") 

Observable.zip(observable1, observable2) 
	.subscribe(onNext: { value1, value2 in 
    	print("Value1: \(value1), Value2: \(value2)") 
    }) 
    .disposed(by: disposeBag)

출력

Value1: 1, Value2: A 
Value1: 2, Value2: B 
Value1: 3, Value2: C

 

주요 포인트

  1. zip은 두 Observable의 값이 동일한 인덱스일 때만 결합합니다.
  2. 하나의 Observable이 완료되면, 결합하지 못한 다른 Observable의 값은 무시됩니다.
  3. 두 Observable 중 값 방출 타이밍이 다를 경우, 느린 Observable을 기다립니다.

2. Observable.combineLatest

combineLatest는 두 개 이상의 Observable이 값을 방출하면, 각 Observable의 가장 최신 값을 결합하여 방출합니다. 결합 시점에서 각 Observable은 최소 하나의 값을 방출해야 결합이 이루어집니다.

특징

  • 최신 값 기반: 하나의 Observable에서 새 값을 방출하면, 다른 Observable의 가장 최신 값과 결합.
  • 모든 Observable이 최초로 값을 방출해야 결합이 시작.
  • 실시간 데이터 업데이트에 적합.

사용 예시

let observable1 = BehaviorSubject(value: "A") 
let observable2 = BehaviorSubject(value: 1) 

Observable.combineLatest(observable1, observable2) 
	.subscribe(onNext: { value1, value2 in 
    	print("Value1: \(value1), Value2: \(value2)") 
    }) 
    .disposed(by: disposeBag) 
    
// 방출 시점 추가 
observable1.onNext("B") 
observable2.onNext(2) 
observable1.onNext("C")

출력

Value1: A, Value2: 1 
Value1: B, Value2: 1 
Value1: B, Value2: 2 
Value1: C, Value2: 2

주요 포인트

  1. 결합된 Observable은 가장 최근의 값을 기반으로 동작합니다.
  2. 모든 Observable이 최초로 값을 방출해야 결합이 시작됩니다.
  3. 하나의 Observable이 새로운 값을 방출할 때마다 결합 결과가 다시 방출됩니다.

차이점 비교: zip vs combineLatest

특징zipcombineLatest

결합 기준 동일 인덱스의 값 가장 최신 값
최소 필요 조건 모든 Observable이 동일한 인덱스의 값을 방출해야 함 모든 Observable이 최소 1번 값을 방출해야 함
결과 방출 시점 각 Observable이 값을 방출한 후 Observable 중 하나가 새 값을 방출할 때마다
사용 상황 정렬된 데이터 처리, 병렬 작업 실시간 데이터 업데이트
완료 조건 가장 짧은 Observable 완료 시 완료 모든 Observable 완료 시 완료

zip과 combineLatest를 함께 사용할 수 있을까?

네, 가능합니다. zip과 combineLatest는 각각의 특성을 활용하여 함께 사용할 수 있습니다. 예를 들어, 두 Observable의 최신 값만 받고 싶지만, 특정 시점에 한 번만 처리하려면 zip을 추가로 활용할 수 있습니다.

예시

let observable1 = BehaviorSubject(value: "Initial") 
let observable2 = BehaviorSubject(value: 0) 

Observable.combineLatest(observable1, observable2) 
	.take(2) // 최신 값 두 개만 가져오기 
    .toArray() 
    .flatMap { 
    	Observable.zip(Observable.from($0)) 
    } 
    .subscribe(onNext: { value in 
    	print("Combined value: \(value)") 
    }) 
    .disposed(by: disposeBag)

결론

  • zip: 순차적이고 병렬적인 작업(예: API 호출 결과 병합)에 적합.
  • combineLatest: 실시간으로 최신 데이터를 결합해야 하는 작업(UI 업데이트)에 적합.

필요한 작업의 특성에 따라 두 연산자를 적절히 사용하면 효율적인 데이터 처리와 UI 업데이트가 가능합니다.

반응형