[swift] RxCocoa의 Subjects에 대한 이해

RxCocoa는 RxSwift와 함께 사용되는 프레임워크로, Cocoa 프레임워크의 일부를 RxSwift와 바인딩하는 역할을 합니다. RxCocoa는 Cocoa 프레임워크의 클래스 및 컴포넌트를 활용하여 반응형 프로그래밍의 장점을 활용할 수 있도록 도와줍니다.

이 중에서 RxCocoa의 Subjects는 Observables과 Observers를 연결하는 브릿지 역할을 합니다. Subjects는 Observable처럼 다른 객체들이 데이터를 구독할 수 있게 하고, Observer처럼 데이터를 방출할 수 있게 합니다. 이를 통해 데이터의 흐름을 제어하고 다른 객체간의 데이터 통신을 쉽게 할 수 있습니다.

RxCocoa의 Subjects에는 다양한 종류가 있습니다. 주로 사용되는 Subjects는 아래와 같습니다.

PublishSubject

let subject = PublishSubject<String>()
subject.onNext("Event 1")

let subscription = subject.subscribe(onNext: { event in
    print(event)
})
subject.onNext("Event 2")

subscription.dispose()
subject.onNext("Event 3")

위의 코드에서는 PublishSubject를 생성하고, 이벤트를 방출한 후에 Observer가 해당 이벤트를 받게 됩니다. 이후에는 observer가 삭제되어서 Event 3이 출력되지 않습니다.

BehaviorSubject

let subject = BehaviorSubject<String>(value: "Initial Value")

let subscription = subject.subscribe(onNext: { event in
    print(event)
})
subject.onNext("New Value")

subscription.dispose()
subject.onNext("Latest Value")

위의 코드에서는 BehaviorSubject를 생성하고, 초기값을 지정한 후에 이벤트를 전달합니다. Observer는 초기 값인 “Initial Value”와 추가적으로 “New Value”를 받게 됩니다. 마지막으로 Subject에 “Latest Value”를 전달해도 Observer는 없으므로 출력되지 않습니다.

Relay

let relay = PublishRelay<String>()
relay.accept("Value 1")

let subscription = relay.subscribe(onNext: { value in
    print(value)
})
relay.accept("Value 2")

subscription.dispose()
relay.accept("Value 3")

위의 코드에서는 Relay를 생성하고 값을 전달합니다. Relay는 값을 Relay.accept 메서드를 통해서만 전달할 수 있으며, 외부에서 직접 값을 전달할 수 없습니다. Subscribe한 후에는 전달한 값들을 받을 수 있지만, Completed 이벤트를 수신할 수 없습니다.

RxCocoa의 Subjects를 사용하면 다양한 Observable과 Observer를 결합하여 데이터의 흐름을 손쉽게 조작할 수 있습니다. 용도에 맞는 Subjects를 적절히 선택하여 반응형 프로그래밍을 구현해보세요.

참고: