[swift] RxSwift에서의 콤비네이션 연산자 사용법

RxSwift는 ReactiveX 프로그래밍을 위한 Swift 라이브러리입니다. 이 라이브러리를 사용하면 비동기 이벤트 스트림을 쉽게 처리할 수 있습니다. RxSwift에서 제공하는 콤비네이션 연산자는 이벤트 스트림을 조합하고 변형하는데 유용합니다. 이번 포스트에서는 RxSwift에서 콤비네이션 연산자의 사용법에 대해 알아보겠습니다.

combineLatest

combineLatest 연산자는 두 개 이상의 Observable을 조합하여 새로운 Observable을 만듭니다. 새로운 Observable은 원본 Observable들의 가장 최근 값을 받아 업데이트됩니다. 예를 들어, A와 B라는 두 개의 Observable이 있다고 가정해 봅시다. 두 Observable 중 하나가 값을 방출하면 두 Observable의 최근 값으로 새로운 값을 생성하게 됩니다.

let observableA = Observable<Int>.just(1)
let observableB = Observable<Int>.just(2)

Observable.combineLatest(observableA, observableB) { a, b in
    return a + b
}.subscribe(onNext: { result in
    print(result) // Output: "3"
}).disposed(by: disposeBag)

위 예제에서는 combineLatest 연산자를 사용하여 observableAobservableB를 조합하여 새로운 Observable을 생성합니다. 조합된 Observable은 두 Observable의 최근 값을 더한 값을 방출합니다. 따라서 위의 코드는 1과 2를 더한 값인 3을 출력합니다.

zip

zip 연산자는 두 개 이상의 Observable을 조합하여 새로운 Observable을 만듭니다. 새로운 Observable은 원본 Observable들이 모두 값을 방출할 때에만 값을 방출합니다. 예를 들어, A와 B라는 두 개의 Observable이 있다고 가정해 봅시다. A는 1과 2를 차례로 방출하고, B는 3과 4를 차례로 방출한다면, zip 연산자는 1과 3을 조합하여 4를 방출하고, 이후 2와 4를 조합하여 6을 방출합니다.

let observableA = Observable<Int>.from([1, 2])
let observableB = Observable<Int>.from([3, 4])

Observable.zip(observableA, observableB) { a, b in
    return a * b
}.subscribe(onNext: { result in
    print(result) // Output: "3", "8"
}).disposed(by: disposeBag)

위 예제에서는 zip 연산자를 사용하여 observableAobservableB를 조합하여 새로운 Observable을 생성합니다. 조합된 Observable은 두 Observable의 값을 곱한 값을 방출합니다. 결과적으로 위의 코드는 1과 3을 곱한 값인 3과 2와 4를 곱한 값인 8을 출력합니다.

switchLatest

switchLatest 연산자는 Observable의 Observable을 사용하여 새로운 Observable을 만듭니다. 새로운 Observable은 가장 최근에 방출된 Observable의 이벤트만을 전달합니다. 예를 들어, A, B, C라는 세 개의 Observable이 있다고 가정해 봅시다. 각 Observable은 일정 시간마다 값을 방출합니다. switchLatest 연산자를 사용하면 가장 최근에 방출된 Observable의 이벤트만을 전달받을 수 있습니다.

let observableA = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
let observableB = Observable<Int>.interval(.seconds(2), scheduler: MainScheduler.instance)
let observableC = Observable<Int>.interval(.seconds(3), scheduler: MainScheduler.instance)

Observable.of(observableA, observableB, observableC)
    .switchLatest()
    .subscribe(onNext: { result in
        print(result) // Output: "0", "0", "1", "2", "3", ...
    }).disposed(by: disposeBag)

위 예제에서는 switchLatest 연산자를 사용하여 observableA, observableB, observableC를 조합하여 새로운 Observable을 생성합니다. 새로운 Observable은 가장 최근에 방출된 Observable의 이벤트만을 전달받습니다. 따라서 위의 코드는 observableA의 0, 1, 2, … 시퀀스를 출력하게 됩니다.

결론

RxSwift에서 제공하는 콤비네이션 연산자(예: combineLatest, zip, switchLatest)는 이벤트 스트림을 조합하고 변형하는데 유용합니다. 이를 통해 비동기 이벤트 처리를 더욱 효율적으로 할 수 있습니다. 콤비네이션 연산자의 사용법에 대해 알아보았으니, RxSwift를 사용할 때 이러한 연산자를 적절히 활용하여 코드를 작성해 보시기 바랍니다.

참고 자료