두개이상의 이벤트를 저장해두고 새로운 구독자로 전달하고 싶다면 ReplaySubject를 사용한다.
ReplaySubject는 생성자가 아닌 create메서드로 생성한다.
그리고 버퍼의 사이즈를 전달하는데 N을 입력하면 N개의 이벤트를 저장한다.
let rs = ReplaySubject<Int>.create(bufferSize: 3)
(1...10).forEach{ rs.onNext($0)}
rs.subscribe{ print("Observer1 >> ", $0)}
.disposed(by: disposeBag)
//Observer1 >> next(8)
//Observer1 >> next(9)
//Observer1 >> next(10)
3개의 next가 나온 이유는 버퍼의 크기를 3으로 지정했기 때문.
버퍼에는 마지막에 전달된 3개가 저장된다.
또한 이 3개의 이벤트가 NextEvent로 전달된다.
버퍼는 메모리에 저장되기 때문에 항상 메모리 관리에 신경 써야한다.
필요이상으로 큰 버퍼를 사용하는 것은 피해야한다.
let rs = ReplaySubject<Int>.create(bufferSize: 3)
(1...10).forEach{ rs.onNext($0)}
rs.subscribe{ print("Observer1 >> ", $0)}
.disposed(by: disposeBag)
rs.subscribe{ print("Observer2 >> ", $0)}
.disposed(by: disposeBag)
rs.onNext(11)
rs.onCompleted()
rs.subscribe{ print("Observer1 >> ", $0)}
.disposed(by: disposeBag
//Observer1 >> next(8)
//Observer1 >> next(9)
//Observer1 >> next(10)
//Observer2 >> next(8)
//Observer2 >> next(9)
//Observer2 >> next(10)
//Observer1 >> next(11)
//Observer2 >> next(11)
//Observer1 >> completed
//Observer2 >> completed
//Observer1 >> next(9)
//Observer1 >> next(10)
//Observer1 >> next(11)
//Observer1 >> completed
completedEvent를 전달하게 되면 버퍼에 저장된 개수만큼의 마지막 이벤트가 전달되고
CompletedEvent가 전달된다.
ErrorEvent 또한 같다
ReplaySubject는 종료의 여부와 관계없이 항상 저장된 이벤트를 새로운 구독자에게 전달한다.