[RxSwift] PublishSubject
2025. 1. 10. 23:34ㆍiOS
반응형
PublishSubject는 RxSwift에서 제공하는 또 다른 종류의 Subject로, 값의 전달을 구독 이후에만 시작하는 특징을 가집니다. 즉, 구독자가 구독을 시작한 후에만 발행된 값을 받을 수 있습니다. PublishSubject는 값에 대한 초기 상태를 가지지 않으며, 구독자가 구독을 시작한 후에 새로운 값만 전달받습니다.
주요 특징
- 초기값 없음: PublishSubject는 초기값을 갖지 않으며, 구독이 시작된 후에만 값이 발행됩니다.
- 구독 시 값 전달: 구독자는 구독을 시작하는 시점부터 새로운 값만 받습니다.
- 동적 데이터 흐름: 발행된 값들은 구독자를 통해 전달되며, 발행이 끝난 후 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 |