Subject
- 실시간으로 Observable에 새로운 값을 수동으로 추가하고, subscriber에 방출하도록 하는 것.
- Hot Observable임.
- Observable이자 Observer의 성격을 지니고 있음.
- Observable의 성격으로 onNext의 형태로 수동으로 값을 추가할 수 있고
- Observer의 성격으로 subscribe를 통해 방출함.
Subject 의 종류
- PublishSubject
- 빈 상태로 시작하여, subscribe 이후의 이벤트만을 subscriber를 통해 방출함.
- PublishSubject는 .completed, .error 이벤트가 발생할때까지, 즉 종료될때까지 subscribe한 이후부터 이벤트를 방출.
- PublishSubject 예시
let subject = PublishSubject<Int>()
let subjectOne = subject
.subscribe(onNext: { (num) in
print("subjectOne :",num)
})
subject.onNext(1)
subject.onNext(2)
let subjectTwo = subject
.subscribe(onNext: { (num) in
print("subjectTwo :", num)
})
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
/*
subjectOne 구독 시점
subjectOne : 1
subjectOne : 2
subjectTwo 구독 시점
subjectOne : 3
subjectTwo : 3
subjectOne : 4
subjectTwo : 4
subjectOne : 5
subjectTwo : 5
*/
let subject = PublishSubject<Int>()
let subjectOne = subject
.subscribe(onNext: { (num) in
print("subjectOne :",num)
}, onError: { (error) in
print("subjectOne Erorr: ",error)
}, onCompleted: {
print("subjectOne onCompleted")
})
subject.onNext(1)
subject.onNext(2)
subject.onCompleted() // 추가
let subjectTwo = subject
.subscribe(onNext: { (num) in
print("subjectTwo :",num)
}, onError: { (error) in
print("subjectTwo Erorr: ",error)
}, onCompleted: {
print("subjectTwo onCompleted")
})
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
/*
subjectOne 구독 시점
subjectOne : 1
subjectOne : 2
subjectOne onCompleted
subjectTwo 구독 시점 (이미 subject가 completed 종료되어 onCompleted 방출)
subjectTwo onCompleted
*/
- BehaviorSubject
- BehaviorSubject는 PublicshSubject와 유사하지만, 초기값을 가짐.
- subscribe 직전의 하나의 이벤트를 포함한채 subscribe 이후 이벤트들을 subscriber를 통해 방출함.
- BehaviorSubject 예시
let subject = BehaviorSubject(value: 5)
let subjectOne = subject
.subscribe(onNext: { (num) in
print("subjectOne :",num)
}, onError: { (error) in
print("subjectOne Erorr: ",error)
}, onCompleted: {
print("subjectOne onCompleted")
})
subject.onNext(6)
subject.onNext(7)
subject.onNext(8)
let subjectTwo = subject
.subscribe(onNext: { (num) in
print("subjectTwo :",num)
}, onError: { (error) in
print("subjectTwo Erorr: ",error)
}, onCompleted: {
print("subjectTwo onCompleted")
})
subject.onNext(9)
subject.onNext(10)
/*
subjectOne 구독 시점
subjectOne : 5 // 초기값 세팅
subjectOne : 6
subjectOne : 7
subjectOne : 8
subjectTwo 구독 시점
subjectTwo : 8 // 직전 값(8)을 초기값으로 세팅
subjectOne : 9
subjectTwo : 9
subjectOne : 10
subjectTwo : 10
*/
- ReplaySubject
- 버퍼를 두고 초기화하며, 버퍼 사이즈 만큼의 직전의 이벤트들을 포함한채 subscribe 이후 이벤트들을 subscriber를 통해 방출한다.
- 생성 시 선택한 특정 크기만큼 일시적으로 캐시하거나 버퍼를 저장해서 최신 요소를 모두 방출
- 예를 들면, 최근 검색어 같은 곳에서 사용
- ReplaySubject 예시
let subject = ReplaySubject<Int>.create(bufferSize: 3)
subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
subject.onNext(6)
let subjectOne = subject.subscribe(onNext: { (num) in
print(num)
})
subject.onNext(7)
subject.onNext(8)
subject.onNext(9)
/*
4
5
6
subjectOne 구독 시점 (버퍼 사이즈 : 3 이므로 이전 onNext 4, 5, 6 값을 받을 수 있음)
7
8
9
*/
'rxSwift' 카테고리의 다른 글
[rxSwift] Filtering Operator 의 종류 (0) | 2022.10.22 |
---|---|
[rxSwift] Subject 를 wrapping한 Relay 사용법 (0) | 2022.10.21 |
[rxSwift] Dispose 는 왜 하는 걸까? (0) | 2022.10.20 |
[rxSwift] Observable create 하는 법 (0) | 2022.10.20 |
[rxSwift] Observable subscribe 하는 법 (0) | 2022.10.19 |