Post

PublishRelay

PublishRelay

PublishRelay는 PublishSubject를 대체하는 Relay타입으로,

  1. 초기값 없이 이벤트를 방출하며, 새로운 구독자는 새로운 값부터 수신합니다.
  2. .accept로 값을 추가하고, .completed.error없이 동작합니다.

사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import RxSwift
import RxRelay

let relay = PublishRelay<String>()
let disposeBag = DisposeBag()

// 첫 번째 구독자
relay.subscribe {
    print("구독 1: \($0)")
}.disposed(by: disposeBag)

// 값 추가
relay.accept("첫 번째 값")  
relay.accept("두 번째 값")

// 두 번째 구독자 추가
relay.subscribe {
    print("구독 2: \($0)")
}.disposed(by: disposeBag)

// 값 추가
relay.accept("세 번째 값")

출력결과

1
2
3
4
5
구독 1:  번째 
구독 1:  번째 
구독 1:  번째 
구독 2:  번째   // ✅ 두 번째 구독자는 이전 값은 못 받고 새로운 값부터 받음

PublishRelay vs BehaviorRelay 차이

특징PublishRelayBehaviorRelay
초기값❌ 없음✅ 있음 (value로 접근 가능)
새 구독자 처리✅ 새로운 값부터 받음✅ 최신 값부터 받음
이전 값 저장 여부❌ 없음✅ 최신 값 저장
값 추가 방법.accept(값).accept(값)
끊김 여부❌ 끊기지 않음❌ 끊기지 않음

즉, PublishRelayPublishSubject처럼 동작하지만, 에러 없이 계속 동작하는 특징이 있음.

이전 값을 저장하지 않기 때문에, 새로운 구독자는 이전 데이터를 받지 않음.

PublishRelay를 언제 사용해야 할까?

  • UI 이벤트 처리 (ex. 버튼 클릭, 네트워크 요청 등)
  • 이전 값을 저장할 필요가 없는 데이터 스트림
  • 끊기지 않는 이벤트 스트림이 필요한 경우 (예: Subject 대신 사용)

버튼 클릭 이벤트 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import RxSwift
import RxRelay

let buttonTapRelay = PublishRelay<Void>()
let disposeBag = DisposeBag()

// 구독: 버튼이 눌릴 때마다 실행됨
buttonTapRelay.subscribe {
    print("버튼 클릭됨!")
}.disposed(by: disposeBag)

// 버튼이 눌렸다고 가정
buttonTapRelay.accept(())
buttonTapRelay.accept(())

출력 결과

1
2
버튼 클릭됨!
버튼 클릭됨!
  • 버튼이 클릭될 때마다 새로운 이벤트를 방출
  • 과거 이벤트는 저장되지 않음 (필요한 순간에만 실행)
This post is licensed under CC BY 4.0 by the author.