RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀
PublishSubject와 BehaviorSubject를 리뷰해보겠다.
PublishSubject는 구독이후의 이벤트를 전달하였고,
BehaviorSubject는 가장 최근의 이벤트를 전달하였다.
그럼, 만약 두개이상의 이벤트를 가지고 있다가, 전달하고 싶을때는 어떻게해야할까?
이때 쓸 수 있는 Subject가 ReplaySubject이다.
ReplaySubject의 definition 중에 생성에 관한 코드이다.
버퍼사이즈값을 파라미터로 받는 것을 확인 할 수 있다.
따라서, let rs = ReplaySubject<String>.create(bufferSize: 3)
와 같이 생성을 해 줄 수 있다.
buffer의 크기를 3으로 가정한다면, a,b,c,d,e 를 가진채 생성이 되고, o1이 구독을 했을 때, 가장 최신 next이벤트 3개가 전달된다. 따라서 c,d,e,가 전달이 된다.
o2의 경우 새로운 f이벤트가 버퍼에 추가되면서, d,e,f가 전달이 될것이다.
여기서, error이벤트도 버퍼에 포함이 될까 궁금했다.
그결과 포함이 되지 않았다. 이부분은 코드에서 다루겠다.
우선 마블다이어그램을 통해 본다면, 버퍼사이즈 만큼의 가장 최신순 next이벤트를 전달 함을 알 수 있다.
1. 버퍼의 크기 만큼 이벤트를 전달 할 수 있다
2. 메모리에 저장되기 때문에 메모리 관리를 신경쓰며 사용할 필요가 있다
마블다이어그램을 코드로 표현해보았다.
전체코드는 여기서확인가능
let arr : [String] = ["a","b","c","d","e"]
let rs = ReplaySubject<String>.create(bufferSize: 3)
arr.forEach { rs.onNext($0)}
rs.subscribe { print("o1 : \($0)")}
//rs.onNext("f")
rs.onError(Err.err)
rs.subscribe { print("o2 : \($0)") }
.disposed(by: disposeBag)
/*
output :
o1 : next(c)
o1 : next(d)
o1 : next(e)
o1 : error(err)
o2 : next(c)
o2 : next(d)
o2 : next(e)
o2 : error(err)
*/
ReplaySubject의 특징을 고려해 언제 사용하면 좋을지 고민해보았다.
다음에는 마지막 subject인 AsyncSubject에 대해 정리해보겠다.