[RxSwift] 4-3. ReplaySubject

miori·2022년 2월 11일
0

RxSwiftBasic

목록 보기
9/29

RxSwift를 21일간 공부하는 루틴
"Rx를 기깔나게 쓰는 신입개발자 도전" 시작 🚀


ReplaySubject

리뷰

PublishSubject와 BehaviorSubject를 리뷰해보겠다.

PublishSubject는 구독이후의 이벤트를 전달하였고,
BehaviorSubject는 가장 최근의 이벤트를 전달하였다.

그럼, 만약 두개이상의 이벤트를 가지고 있다가, 전달하고 싶을때는 어떻게해야할까?

소개

이때 쓸 수 있는 Subject가 ReplaySubject이다.

ReplaySubject의 definition 중에 생성에 관한 코드이다.
버퍼사이즈값을 파라미터로 받는 것을 확인 할 수 있다.

ReplaySubject Def

따라서, let rs = ReplaySubject<String>.create(bufferSize: 3) 와 같이 생성을 해 줄 수 있다.

마블 다이어그램

ReplaySubject마블다이어그램

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의 특징을 고려해 언제 사용하면 좋을지 고민해보았다.

  • 최근 검색 정보 기록을 보여줄때
    - 많은 플랫폼에서 보여주는 검색 기능은 최근 검색기록을 제공한다.
    이때, 몇개의 기록을 제공해줄지 bufferSize로 저장하면, RepalySubject를 적절하게 사용할 수 있을것 같다고 생각한다.

다음에는 마지막 subject인 AsyncSubject에 대해 정리해보겠다.

profile
iS를 공부하는 miori 입니다.

0개의 댓글

관련 채용 정보