iOS/RxSwift

[RxSwift] Subject - ReplaySubject

_Rey 2022. 9. 16. 12:06
let replaySubject = ReplaySubject<Int>.create(bufferSize: 3)
// 3개의 마지막 이벤트를 저장

https://reactivex.io/documentation/subject.html

ReplaySubject는 마지막으로 전달된 n개의 이벤트를 버퍼에 저장한다.

 

[1,2,3,4,5,6,7,8,10].forEach {
    replaySubject.onNext($0)
}

replaySubject.subscribe {
    print("ReplaySubject 1", $0)
}
.disposed(by: disposeBag)

// Output
ReplaySubject 1 next(8)
ReplaySubject 1 next(9)
ReplaySubject 1 next(10)

마지막 3개의 이벤트를 저장했기 때문에 Subscriber가 추가되자마자 10개 중 마지막 3개의 이벤트가 전달되었다.

 

replaySubject.subscribe {
    print("ReplaySubject 2", $0)
}
.disposed(by: disposeBag)

// Output
ReplaySubject 2 next(8)
ReplaySubject 2 next(9)
ReplaySubject 2 next(10)

새로운 다른 Subscriber가 추가되어도 마찬가지로 마지막으로 저장된 이벤트를 전달한다.

 

replaySubject.onNext(11)

replaySubject.subscribe {
    print("ReplaySubject 3", $0)
}
.disposed(by: disposeBag)

// Output
ReplaySubject 1 next(11)
ReplaySubject 2 next(11)
ReplaySubject 3 next(9)
ReplaySubject 3 next(10)
ReplaySubject 3 next(11)
replaySubject.onCompleted()

// Output
ReplaySubject 1 completed
ReplaySubject 2 completed
ReplaySubject 3 completed

새로운 이벤트의 추가

 

replaySubject.subscribe {
    print("ReplaySubject 4", $0)
}
.disposed(by: disposeBag)

// Output
ReplaySubject 4 next(9)
ReplaySubject 4 next(10)
ReplaySubject 4 next(11)
ReplaySubject 4 completed

 

Output 로그를 보면, 버퍼에 저장하고 전달하는 이벤트는 onNext 이벤트라는 것을 알 수 있다.

 

항목이 많아질 경우에 순서와 지연이 중요한 항목들이 있다면 사용에 주의해야한다.