-
RxSwift - share(), share(replay:, scope:)에 대해서 알아보자Ray Wenderlich/RxSwift 2018. 6. 24. 17:30
p.125참조. ( 이번 포스트는 번역글이 아닙니다. :) )
share()
Rx를 처음 시작할 때, 자주 실수하는 부분이 있다.
Observable을 subscribe할 때마다, 새로운 Observable 시퀀스가 생성된다는 것이다.
예를 들어, 아래 코드를 실행한다고 생각해보자.
let results = query.rx.text
.flatMapLatest { query in
networkRequestAPI(query)
}
results.subscribe(...) // a network request
results.subscribe(...) // another network request
results는 API Request를 발생시키는 Observable이다.
이를 두번 subscribe하고 있으니, API Request는 두 번 발생하게 된다.
그렇다면 열 번 subscribe하면 API Request이 열 번 발생하나?
그렇다!! 너무 치명적인 것!
그래서 우리는 share()를 사용한다.
share()는 말 그대로, 한번 생성한 시퀀스를 공유 하는 것이다.
share()를 사용하면 시퀀스에서 발생한 이벤트가 버퍼에 저장되고, 새로운 subscription은 버퍼에 저장된 이벤트를 전달받게 되는 것이다.
(느낌이 살살 오시나요?)
그림을 통해서 알아보자.
share()를 사용하지 않으면 두 개의 시퀀스가 생성된다.
share()를 사용하면 하나의 시퀀스를 같이 사용한다.
사용은 간단하다.
let results = query.rx.text
.flatMapLatest { query in
networkRequestAPI(query)
}.share()
results.subscribe(...) // a network request
results.subscribe(...) // another network request
이제 API가 반복 호출되는 일은 없을 것이다.
share()에도 하지만 여~~러 옵션이 있고, 유사한 operator들이 즐비한다.
버퍼를 얼마나 유지할 것인지 등등..
유사한 operator들을 확인할 수 있는 링크는 아래와 같다.
https://medium.com/@_achou/rxswift-share-vs-replay-vs-sharereplay-bea99ac42168
share(replay:, scope:)
replay는 버퍼 사이즈를 의미한다.
scope는 .forever, .whileConnectd 두 개의 값을 가질 수 있다.
.whileConnected: 1개 이상 subscriber가 존재하는 동안에만, 버퍼가 유지된다. 따라서 subscription이 0개가 된 뒤에 발생하는 subscription은 새로운(latest) 결과를 갖게
.forever: 버퍼를 생성한 뒤, subscription의 존재 여부에 관계 없이 버퍼가 유지된다.
그렇다면 share()와 share(replay:, scope:)는 어떤 차이가 있는가??
share()를 선언하고 있는 코드를 보면 아래와 같다.
public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected) -> Observable<E> {
...
}
즉, 그냥 0과 .whileConnected가 디폴트 값이고, 이를 생략한 것이 share()라고 보면 된다.
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - merge()에 대해서 알아보자. (0) 2018.07.06 RxSwift - startWith(_:), concat(_:), concatMap(_:)에 대해서 알아보자. (0) 2018.07.05 RxSwift - materialize, dematerialize에 대해서 알아보자. (0) 2018.06.13 RxSwift - flatMapLatest에 대해서 알아보자. (0) 2018.06.12 RxSwift - flatMap에 대해서 알아보자. (0) 2018.06.02