ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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()라고 보면 된다.




Designed by Tistory.