[RxSwift] Subject
2023. 9. 16. 17:24
Subject
observer(관찰자)와 Observable을 모두 수행할 수 있는 Class
※ 여기서 observer은 세부 정보를 저장, 코드를 한 번만 실행하고 모든 observer에 결과를 제공
PublishSubject
- 빈 상태로 시작, 새로운 값만 subscriber에 방출
- Observable이 오류로 종료되면 PublishSubject 이후 subscriber에 가지 않고 Observable의 오류로 방출
let publishSubject = PublishSubject<String>()
publishSubject.onNext("1. 여러분 안녕하세요")
let 구독자1 = publishSubject
.subscribe(onNext: {
print("첫 번째 구독자 : \($0)")
})
publishSubject.onNext("2. 들리세요?")
publishSubject.on(.next("3. 안들리시나요?")) // 위 문장과 동일한 표현
// 첫 번째 구독자 : 2. 들리세요?
// 첫 번째 구독자 : 3. 안들리시나요?
구독자1.dispose()
let 구독자2 = publishSubject
.subscribe(onNext: {
print("두 번째 구독자 : \($0)")
})
publishSubject.onNext("4. 여보세요")
publishSubject.onCompleted()
publishSubject.onNext("5. 끝났나요?") // 출력 안됨
구독자2.dispose()
publishSubject
.subscribe {
print("세 번째 구독 :", $0.element ?? $0)
}.disposed(by: disposeBag)
publishSubject.onNext("6. 찍힐까요?") // 출력 안됨
// 첫 번째 구독자 : 2. 들리세요?
// 첫 번째 구독자 : 3. 안들리시나요?
// 두 번째 구독자 : 4. 여보세요
// 세 번째 구독 : completed
BehaviorSubject
- 하나의 초깃값을 가진 상태로 시작, 새로운 subscriber에게 초기값 또는 최신값을 방출
- Observable에서 가장 최근에 방출된 항목( 없는 경우 기본값)을 방출하는 것으로 시작하고
나중에 Observable에서 방출한 다른 항목을 계속해서 방출
enum SubjectError: Error{
case error1
}
let behaviorSubject = BehaviorSubject<String>(value: "초기값")
behaviorSubject.onNext("1. 첫번째값")
behaviorSubject.subscribe{
print("첫번째 구독 :" , ($0.element ?? $0))
}.disposed(by: disposeBag)
//behaviorSubject.onError(SubjectError.error1)
behaviorSubject.subscribe{
print("두번쨰 구독 :", ($0.element ?? $0))
}.disposed(by: disposeBag)
// 첫번째 구독 : 1. 첫번째값
// 두번쨰 구독 : 1. 첫번째값
let value = try? behaviorSubject.value()
print(value) // 1. 첫번째값
ReplaySubject
- 버퍼를 두고 초기화, 버퍼 사이즈 만큼의 값들을 유지하면서 새로운 subscriber에게 방출
let replaySubject = ReplaySubject<String>.create(bufferSize: 3)
replaySubject.onNext("1. 여러분")
replaySubject.onNext("2. 힘내세요")
replaySubject.onNext("3. 어렵지만")
replaySubject.subscribe{
print("첫번째 구독" , $0.element ?? $0)
}.disposed(by: disposeBag)
// 첫번째 구독 error(error1)
replaySubject.subscribe{
print("두번째 구독", $0.element ?? $0)
}
.disposed(by: disposeBag)
// 두번째 구독 error(error1)
replaySubject.onNext("4. 할 수 있어요.")
replaySubject.onError(SubjectError.error1)
replaySubject.dispose()
replaySubject.subscribe{
print("세번째 구독", $0.element ?? $0)
}
.disposed(by: disposeBag)
// 세번째 구독 error(Object `RxSwift.(unknown context at $106c44e50).ReplayMany<Swift.String>` was already disposed.)
출처
패스트캠퍼스 | 30개 프로젝트로 배우는 iOS 앱개발 with Swift 초격차 패키지 Online
728x90
'iOS > RxSwift' 카테고리의 다른 글
RxSwift 시즌 2 정리 (0) | 2025.01.12 |
---|---|
[RxSwift] TimeBasedOperator (0) | 2023.10.03 |
[RxSwift] Combine Operator (0) | 2023.10.03 |
[RxSwift] Traits (0) | 2023.09.18 |
[RxSwift] Observable (0) | 2023.09.10 |