RxSwift에서 Subject
는 Observable이자 Observer로 동작하여, 이벤트를 방출하고 구독자에게 전달하는 중요한 역할을 한다. PublishSubject
, BehaviorSubject
, ReplaySubject
등이 이에 해당하며, 각각의 특성에 따라 초기값을 가지거나, 특정 수의 이벤트를 재방출하는 등 다양한 기능을 제공한다.
반면에, Relay
는 Subject
와 유사하지만 종료 이벤트(.completed, .error)를 방출하지 않는다는 점에서 차이가 있다. 이 때문에 Relay
는 더 안정적이며, UI 상태 관리나 데이터 흐름 제어에 적합한 도구로 사용된다.
Relay
는 RxCocoa에서 제공하는 클래스로, BehaviorRelay
와 PublishRelay
두 가지가 대표적이다. 이들은 모두 Subject
와 유사하게 동작하지만, .completed
나 .error
와 같은 종료 이벤트를 방출하지 않고, 값이 방출될 때까지 구독이 유지된다는 점에서 차별화된다.
특징: PublishRelay
는 초기값이 없으며, 새로운 이벤트가 발생할 때만 구독자에게 값을 전달한다. 이는 PublishSubject
와 유사한 동작이다. 하지만 종료 이벤트가 없기 때문에, 항상 활성 상태를 유지하며 구독자들에게 최신 이벤트를 방출할 수 있다.
사용 예시:
let relay = PublishRelay<String>()
relay.accept("첫 번째 값")
relay.subscribe(onNext: { value in
print(value)
})
relay.accept("두 번째 값")
PublishRelay
는 첫 번째 값을 방출하기 전에 구독자가 없었기 때문에, 첫 번째 값은 출력되지 않는다. 하지만 이후 두 번째 값이 구독자에게 전달된다.특징: BehaviorRelay
는 초기값을 가질 수 있으며, 최신 값을 유지한다. 새로운 구독자가 추가되면, 즉시 마지막으로 방출된 값을 받을 수 있다. 이는 BehaviorSubject
와 유사하지만, 종료 이벤트가 없다는 점이 다르다.
사용 예시:
let relay = BehaviorRelay(value: "초기값")
relay.subscribe(onNext: { value in
print(value)
})
relay.accept("새로운 값")
BehaviorRelay
는 구독자가 구독을 시작할 때, 현재 값을 즉시 방출한다. 이후 accept
메서드를 통해 새로운 값을 설정하면, 해당 값이 구독자에게 전달된다.이벤트 종료:
Subject
: .completed
와 .error
이벤트를 방출할 수 있다. 이는 Observable 체인의 끝을 나타내며, 이후에는 더 이상 이벤트를 방출할 수 없다.Relay
: 종료 이벤트가 없다. 구독이 계속 유지되며, 값이 방출될 때까지 계속해서 구독자를 유지할 수 있다.초기값:
PublishRelay
: 초기값이 없다.BehaviorRelay
: 초기값이 필요하며, 구독자가 구독을 시작하면 즉시 마지막 값을 방출한다.상태 관리:
BehaviorRelay
는 상태 관리에 매우 유용하다. 마지막 값을 항상 유지하며, 새로운 구독자가 있을 때 이를 전달할 수 있다.PublishRelay
는 특정 이벤트가 발생할 때만 값을 전달하며, 이전 이벤트의 상태를 유지하지 않는다.사용 사례:
Relay
: UI와 데이터 바인딩, 지속적인 상태 관리가 필요한 경우에 주로 사용된다.Subject
: Observable 체인을 종료하거나, 이벤트 스트림을 명시적으로 관리해야 하는 경우에 사용된다.