[RxSwift] PublishSubject

2025. 1. 10. 23:34iOS

반응형

PublishSubject는 RxSwift에서 제공하는 또 다른 종류의 Subject로, 값의 전달을 구독 이후에만 시작하는 특징을 가집니다. 즉, 구독자가 구독을 시작한 후에만 발행된 값을 받을 수 있습니다. PublishSubject는 값에 대한 초기 상태를 가지지 않으며, 구독자가 구독을 시작한 후에 새로운 값만 전달받습니다.

주요 특징

  1. 초기값 없음: PublishSubject는 초기값을 갖지 않으며, 구독이 시작된 후에만 값이 발행됩니다.
  2. 구독 시 값 전달: 구독자는 구독을 시작하는 시점부터 새로운 값만 받습니다.
  3. 동적 데이터 흐름: 발행된 값들은 구독자를 통해 전달되며, 발행이 끝난 후 onCompleted() 또는 onError()로 종료될 수 있습니다.

사용 예제

초기화 및 기본 동작

import RxSwift 

// PublishSubject 생성 
let subject = PublishSubject<String>() 

// 첫 번째 구독자 
subject.subscribe(onNext: { value in 
	print("Subscriber 1 received: \(value)") 
})
.disposed(by: DisposeBag()) 

// 값 발행 
subject.onNext("Hello") 

// 두 번째 구독자 
subject.subscribe(onNext: { value in 
	print("Subscriber 2 received: \(value)") 
})
.disposed(by: DisposeBag()) 
// 추가 값 발행 

subject.onNext("World") 
subject.onNext("RxSwift")

출력 결과:

Subscriber 1 received: Hello 
Subscriber 1 received: World 
Subscriber 1 received: RxSwift 
Subscriber 2 received: World 
Subscriber 2 received: RxSwift

주요 메서드

  • onNext(_:): 구독자에게 새로운 값을 발행합니다.
  • onError(_:): 에러를 발행하고 모든 구독을 종료합니다.
  • onCompleted(): 완료 이벤트를 발행하고 모든 구독을 종료합니다.

주의 사항

  • 구독자에게는 구독 시작 후에 발행된 값만 전달됩니다. 구독자가 구독을 시작하기 전의 값은 받지 않으므로, 이전 값들이 필요하다면 ReplaySubject나 BehaviorSubject를 사용하는 것이 좋습니다.

적합한 사용 사례

  • 동적 이벤트 처리: 예를 들어, 버튼 클릭 이벤트, 네트워크 응답 등 구독자에게 새로운 데이터를 전달하는 경우.
  • 구독 시점부터 데이터를 시작하는 경우, 예를 들어, 새로운 데이터가 발행되는 시점을 기준으로 처리해야 할 때 유용합니다.
  • 단방향 데이터 흐름: 값의 흐름이 한 방향으로 진행되며, 이전 값에 대한 기억 없이 진행될 때 사용됩니다.

비교: PublishSubject vs BehaviorSubject

  • PublishSubject는 구독 시점부터 발행된 값만 구독자가 받습니다. 반면, BehaviorSubject는 항상 가장 최근의 값을 유지하고 있으며, 구독자가 구독을 시작하면 최신 값을 즉시 받을 수 있습니다.

예시:

let behaviorSubject = BehaviorSubject(value: "Initial Value") 
let publishSubject = PublishSubject<String>() 

behaviorSubject.onNext("Updated Value") 

// 구독자 1은 바로 'Updated Value'를 받습니다. 
behaviorSubject.subscribe(onNext: { value in 
	print("BehaviorSubscriber1: \(value)") 
}) 

// 구독자 2는 구독 시점부터 'Updated Value'를 받습니다. 
publishSubject.subscribe(onNext: { value in 
	print("PublishSubscriber: \(value)") 
}) 

publishSubject.onNext("New Value")
반응형

'iOS' 카테고리의 다른 글

[iOS] ARC (Automatic Reference Counting)  (0) 2025.01.19
[iOS] 카메라(Camera)/앨범(Album) 권한  (0) 2025.01.13
[RxSwift] BehaviorSubject  (0) 2025.01.10
[iOS] Keychain과 UserDefaults 병행  (1) 2025.01.10
[API] 400 Bad Request  (0) 2025.01.10