→ Observable/ Observer기능을 둘다 하는 것이 Subject

publishsubject, behaviorsubject, replaysubject , [publishreplay, behaviorrelay]

1. publishSubject

empty상태로 시작, 새로운 이벤트만 subscriber에게 emit

→ 구독된 순간 새로운 이벤트 수신을 알리고 싶을 경우

Untitled

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
*/

2.BehaviorSubject

Untitled

구독을 시작하면 마지막에 발생했던 이벤트를 구독자에게 넘겨줌

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)

*/

3. ReplaySubject

→ 버퍼 사이즈를 지정하며, 버퍼 사이즈만큼 새로운 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)
*/

4. PublishRelay, BehaviorRelay

→ 오직 .next 이벤트만을 emitgka

realy의 핵심은 절대 끝나지 않음을 보장하는 것