본문 바로가기
iOS/RxSwift

[RxSwift] Merge와 concat

by 최지철 2024. 9. 19.
728x90
반응형

RxSwift의 Merge와 Concat

Observable을 합치는 경우 Merge와 Conact를 사용하는데, 사용하면서도 2개의 연산자에 대한 확실한 차이와 어떤경우에 써야하는지를 정확히 파악하고 있지 못한것 같아, Merge와 Conact를 알아보기로 했습니다 ㅎ.ㅎ

Merge 연산자

merge 연산자는 여러 Observable을 동시에 구독하여 각 Observable에서 방출되는 이벤트를 순서와 상관없이 전달합니다. 즉, 모든 Observable에서 발생하는 이벤트를 병합하여 하나의 Observable로 만들어줍니다.

예제 코드:

let observable1 = Observable.of(1, 3, 5)
let observable2 = Observable.of(2, 4, 6)

Observable.merge(observable1, observable2)
    .subscribe(onNext: { value in
        print(value)
    })

// 출력 결과 (순서는 실행마다 달라질 수 있음):
// 1
// 2
// 3
// 4
// 5
// 6
 

주의: 이벤트의 방출 순서는 각 Observable의 실행 속도에 따라 달라질 수 있습니다.

Concat 연산자

concat 연산자는 여러 Observable을 순서대로 연결하여 하나의 Observable로 만들어줍니다. 앞의 Observable이 완료된 후에 다음 Observable을 구독하므로, 이벤트는 정해진 순서대로 방출됩니다.

예제 코드:

let observable1 = Observable.of(1, 2, 3)
let observable2 = Observable.of(4, 5, 6)

Observable.concat([observable1, observable2])
    .subscribe(onNext: { value in
        print(value)
    })

// 출력 결과:
// 1
// 2
// 3
// 4
// 5
// 6

주의: 첫 번째 Observable이 완료되지 않으면 다음 Observable은 구독되지 않습니다.

 


Merge와 Concat의 차이점

1. 실행 방식

  • Merge
    • 모든 Observable을 동시에 구독합니다. (방출되는 선착순으로 머지한다)
    • 각 Observable에서 이벤트가 발생하는 즉시 방출합니다.
  • Concat
    • Observable을 순서대로 구독합니다.
    • 앞의 Observable이 완료된 후에 다음 Observable을 구독합니다.

2. 이벤트 방출 순서

  • Merge
    • 이벤트의 방출 순서는 예측할 수 없습니다.
    • 각 Observable의 실행 시간에 따라 달라집니다.
  • Concat
    • 이벤트가 정해진 순서대로 방출됩니다.
    • 순서를 보장해야 하는 경우에 유용합니다.

언제 사용해야 할까?

Merge를 사용해야 하는 경우

  • 여러 소스에서 발생하는 이벤트를 동시에 처리해야 할 때.
  • 이벤트의 순서가 중요하지 않을 때.
  • 예를 들어, 여러 API 호출의 응답을 병합하여 처리하거나, 사용자 입력 이벤트를 동시에 처리할 때.

Concat을 사용해야 하는 경우

  • 이벤트의 순서가 중요한 경우
  • 이전 작업이 완료된 후에 다음 작업을 수행해야하는 경우
  • 예를 들어, 로그인 후에 사용자 데이터를 가져와야 하는 경우

결론

RxSwift의 merge와 concat 연산자는 비동기 프로그래밍에서 Observable을 효율적으로 관리하는 데 매우 유용합니다.

각 연산자의 특성을 이해하고 적절하게 사용하면 복잡한 비동기 작업도 간단하고 명확하게 구현할 수 있습니다.

  • Merge동시에 발생하는 이벤트를 처리할 때 사용하고,
  • Concat순서가 중요한 이벤트를 처리할 때 사용합니다.
728x90
반응형