→ Observable/ Observer기능을 둘다 하는 것이 Subject
publishsubject, behaviorsubject, replaysubject , [publishreplay, behaviorrelay]
empty상태로 시작, 새로운 이벤트만 subscriber에게 emit
→ 구독된 순간 새로운 이벤트 수신을 알리고 싶을 경우

example(of: "PublisSubject") {
let subject = PublishSubject<String>()
subject.onNext("Is anyone Listening?")
let subscriptionOne = subject.subscribe(
onNext: {print($0)}
)
subject.on(.next("1"))
subject.onNext("2")
let subTwo = subject.subscribe{
print("2)",$0)
}
subject.onNext("3")
subscriptionOne.dispose()
subject.onNext("4")
subject.onCompleted()
subject.onNext("5")//none print
subTwo.dispose()
let disposeBag = DisposeBag()
subject.subscribe{
print("3)",$0.element ?? $0)
}.disposed(by: disposeBag)
subject.onNext("?")//nonprint
}
/*
--- Example of:PublisSubject---
1
2
3
2) next(3)
2) next(4)
2) completed
3) completed
*/

구독을 시작하면 마지막에 발생했던 이벤트를 구독자에게 넘겨줌
enum MyError:Error{
case anError
}
example(of: "BehaviorSubject") {
let subject = BehaviorSubject(value:"Initial value")
let disposeBag = DisposeBag()
subject.onNext("X")
subject.subscribe{
print("1)",$0)
}.disposed(by: disposeBag)
subject.onError(MyError.anError)
subject.subscribe{
print("2)",$0)
}.disposed(by: disposeBag)
}
/*
--- Example of:BehaviorSubject---
1) next(X)
1) error(anError)
2) error(anError)
*/
→ 버퍼 사이즈를 지정하며, 버퍼 사이즈만큼 새로운 subscriber에게 emit
example(of: "replaySubject") {
let subject = ReplaySubject<String>.create(bufferSize: 2)
let disposeBag = DisposeBag()
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
subject.subscribe{
print("1)",$0)
}.disposed(by: disposeBag)
subject.subscribe{
print("2)",$0)
}.disposed(by: disposeBag)
subject.onNext("4")
subject.onError(MyError.anError)
//subject.dispose()
subject.subscribe{
print("3)",$0)
}.disposed(by: disposeBag)
}
/*
--- Example of:replaySubject---
1) next(2)
1) next(3)
2) next(2)
2) next(3)
1) next(4)
2) next(4)
1) error(anError)
2) error(anError)
3) next(3)
3) next(4)
3) error(anError)
*/
→ 오직 .next 이벤트만을 emitgka
realy의 핵심은 절대 끝나지 않음을 보장하는 것