티스토리 뷰
ReactorKit 을 사용해 MVVM 구조를 리팩토링 하던중 concat 과 merge 를 정리할 필요가 있어서 알아봤다.
둘다 RxSwift 의 결합 오퍼레이터중에 하나이다. 시퀀스를 합성해주는역할을 한다고 알고있지만 구체적으로 어떻게 동작 하고있는지
어떤 차이점이 있는지 알아보고 싶었다.
먼저 Concat

문서상에서는 2개 이상의 Observables 를 중간에 넣지 않고 배출한다 라고 설명 되어있는데, 그림을 봐서는 시퀀스를 결합할때 중간에 끼워 넣지 않고 순차적으로 배출하는것 처럼 보인다.
일단 코드를 만들어보자.
let first = Observable.of(1,2,3)
let second = Observable.of(4,5,6)
let observables = Observable
.concat([first,second])
observables
.subscribe(onNext: { sequnce in
print(sequnce)
})
.disposed(by: bag)
// 결과
// 1
// 2
// 3
// 4
// 5
// 6
결과는 예상대로 1,2,3,4,5,6 순차 적으로 출력이 된다.
아래 형태로도 사용할 수있다고 한다
let observables = first.concat(second)

하나의 Observable 이 완료 될때까지 그 이벤트를 전달하고 완료되면 즉시 다음 Observable의 이벤트를 연이어 전달하고
마지막 Observable 이 complete 되면 종료 된다.
먼저 발생한 Observable 이 완료되고 그다음 Observable이 수행되어야 할 때 유용하다.
만약 중간에 Error 이벤트가 발생할 경우 이후 Observable 은 즉시 종료되서 dispose 됨

여러 Observables 를 하나로 합하여 그 방출량을 합한다. 라는데 이게 무슨말일까
Merge 연산자 를 사용하면 여러 Observable의 출력을 결합하여 단일 Observable처럼 작동할 수 있다고 한다.
Merge는 병합된 Observable이 방출한 항목을 이전 Observable 에 삽입할 수 있다 (비슷한 연산자인 Concat은 항목을 삽입하지 않지만 다음 Observable에서 항목을 방출하기 시작하기 전에 각 Observable의 모든 항목을 차례로 방출한다.)
라는 설명
코드로 실행해보면
let first = Observable.of(1,2,3)
let second = Observable.of(4,5,6)
let observables = Observable.merge([first,second])
observables
.subscribe(onNext: { sequnce in
print(sequnce)
})
.disposed(by: bag)
// 결과
// 1
// 4
// 2
// 5
// 3
// 6
수행 결과는 첫번째와 두번째 Observable 의 이벤트가 각각 섞여서 배출 된다.
(순서는 랜덤이라 실행할 때마다 다른 결과가 나온다.)
여기서 알 수 있는 사실은 merge는 merge하고 있는 여러 시퀀스들을 동시에 구독 하면서, 먼저 오는 이벤트들을 바로 전달 시켜준다.
무조건 선착순이다.
두개이상의 시퀀스를 합칠수도있고, 최대 몇개 시퀀스를 합칠지 정할수도 있다고 한다.
let first = Observable.of(1,2,3)
let second = Observable.of(4,5,6)
let third = Observable.of(7,8,9)
Observable.of(first, second, third)
.merge(maxConcurrent: 2)
.subscribe(onNext: { sequnce in
print(sequnce)
})
.disposed(by: bag)
// 결과
// 1
// 2
// 4
// 3
// 5
// 6
// 7
// 8
// 9
수행한 결과는 maxConcurrent를 2로 설정 해놔서 첫번째와 두번째 시퀀스까진 허용하기 때문에 두개의 시퀀스 간에 순서는 보장 되지 않지만 세번째 시퀀스는 앞선 2개의 시퀀스가 종료되고, 순차적으로 배출되는 것을 확인할 수 있다.

위 다이어그램에서 볼 수 있듯이 onError 이벤트가 발생하면 Observable의 알림은 즉시 관찰자에게 전달되고 병합된 Observable을 종료한다
여기까지 두 결합 오퍼레이터에대해 알아봤는데, 결과적으로 두 오퍼레이터의 차이점은 시퀀스 결합시 concat은 순차적으로 배출되며 순서를 보장해주지만 merge는 순서를 보장해주진 않는다.
concat이 동기적이라면 merge는 비동기적인 관점으로 사용할수 있을것 같다.
출처
https://reactivex.io/documentation/operators/concat.html
https://reactivex.io/documentation/operators/merge.html
ReactiveX - Concat operator
RxKotlin implements this operator as concat. There are variants of this operator that take between two and nine Observables as parameters, and that concatenate them in the order they appear in the parameter list. There is also a variant that takes as a par
reactivex.io
'iOS' 카테고리의 다른 글
| OperationQueue - iOS에서 비동기 작업을 효율적으로 관리하는 방법! (0) | 2025.02.27 |
|---|---|
| Async/Await 완벽 정리 – 왜 써야 할까? 어떻게 써야 할까? (0) | 2025.02.26 |
| iOS에서 비동기 작업을 처리하려면? GCD(DispatchQueue)를 이해하자! (0) | 2025.02.25 |
| Run Loop – iOS 앱은 어떻게 끊기지 않고 동작할까? (0) | 2025.02.24 |
| 캡처 리스트(Capture List) – 클로저가 변수를 기억하는 방법 (0) | 2025.02.21 |