RxSwift + MVVM

RxSwift(10). ReplaySubject

clamp 2023. 2. 17. 12:12

두개이상의 이벤트를 저장해두고 새로운 구독자로 전달하고 싶다면 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는 종료의 여부와 관계없이 항상 저장된 이벤트를 새로운 구독자에게 전달한다.