- Observer인 동시에 Observable이다.
- Observable과 달리 onNext()를 통해 event를 방출할 수 있다.
- Observer들과 Multicast로 연결되어 있어 모든 Observer들에게 한 번에 event를 방출할 수 있다.
- 종류로는 PublishSubject, BehaviorSubject, ReplaySubject가 있다.
💡 Subject - Observer
: Multicast 방식 (1:n 방출-구독)
💡 Observable - Observer
: Unicast 방식 (1:1 방출-구독)
- Observer가 해당 Subject를 구독한 이후에 Observable에 의해 방출된 항목들만 Observer에게 방출한다. (생성 이후 항목을 방출할 수 있다.)
- Observable이 오류로 종료되면 관찰자에게 항목을 내보내지 않고 Observable의 오류 알림을 전달한다.
// 실행코드
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject.onNext("Issue 1")
subject.subscribe { event in
print(event)
}
subject.onNext("Issue 2")
subject.onNext("Issue 3")
//subject.dispose() // 스트림 종료
subject.onCompleted() // 완료
subject.onNext("Issue 4")
// 결과
next(Issue 2)
next(Issue 3)
completed
- Observer가 해당 Subject를 구독하면 Observable에서 가장 최근에 내보낸 항목(또는 아직 내보내지 않은 경우에는 default value)을 방출을 시작으로, Observable에서 다른 항목을 계속 방출한다.
- Observable이 오류로 종료되면 PublishSubject와 같이 관찰자에게 항목을 내보내지 않고 Observable의 오류 알림을 전달한다.
// 실행코드
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "Initial Value")
subject.onNext("Last Issue")
subject.subscribe { event in
print(event)
}
subject.onNext("Issue 1")
// 결과
next(Last Issue)
next(Issue 1)
- Observer가 해당 Subject를 구독한 시기에 관계없이 Observable에서 방출한 모든 항목을 Observer에게 방출한다. (구독 시 기존에 등록된 onNext() event를 다시 구독한다.)
- 재생버퍼가 특정크기 이상으로 커질 위험이 있거나, 항목이 방출된 이후 지정된 기간이 경과하게 되면 오래된 항목을 버리는 버전도 존재한다.
- Observer로 사용할 경우, 여러 스레드에서 onNext()를 사용하면 비순차적으로 호출되어 결과에 모호성이 발생하기 때문에 주의해야한다.
// 실행코드
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 2) // subject가 가지는 buffer 사이즈를 지정한다.
subject.onNext("Issue 1")
subject.onNext("Issue 2")
subject.onNext("Issue 3")
subject.subscribe {
print($0)
}
subject.onNext("Issue 4")
print("[Subscription 1]")
subject.subscribe {
print($0)
}
subject.onNext("Issue 5")
subject.onNext("Issue 6")
print("[Subscription 2]")
subject.subscribe {
print($0)
}
// 결과
next(Issue 2)
next(Issue 3)
next(Issue 4)
[Subscription 1]
next(Issue 3)
next(Issue 4)
next(Issue 5)
next(Issue 5)
next(Issue 6)
next(Issue 6)
[Subscription 2]
next(Issue 5)
next(Issue 6)
💥 공부를 위한 정리글이기 때문에 잘못된 부분이 있을 수 있습니다. 💥