상세 컨텐츠

본문 제목

RxSwift. Ch 8. Transforming Operators in Practice

TIL/RxSwift

by box-jeon 2020. 5. 1. 21:59

본문

특정 repo의 최근 activity를 가져와서 보여주는 GitFeed라는 샘플앱을 이용해 map과 flatMap을 실습합니다. 

Using map to build a request

Observable sequence를 조금 더 추상화해서 보면 data array를 다루는 것과 같다고 볼 수 있습니다. 방출되는 Element들을 map을 통해 변형합니다.

Using flatMap to wait for a web response

이전 챕터에서 flatMap의 기능이 Observable을 방출하는 Observable을 inner Element를 방출하는 Observable로 바꿔주는 것이라고 했지만, flatMap이 주로 사용되는 패턴은 Observable의 transfomation chain에 asynchronous 동작을 연결하는 것입니다. 

share() vs. share(replay: 1)

Observable은 subscription이 시작됐을 때 이벤트를 방출합니다. 때문에 서버로부터 데이터를 가져오는 API 호출 결과를 Observable로 만들었을 때, subscription이 일어날 때마다 API를 호출하게 됩니다. 만약 이러한 상황을 피하고 싶다면 share()를 사용하게 됩니다.

public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected) -> Observable<E>

마지막으로 방출된 Element들을 replay에 해당하는 수만큼 버퍼에 가지고 있다가, 새로운 subscription이 발생하면 버퍼에 있는 Element들을 방출합니다. replay의 디폴트 값이 0인건 약간 의아한 부분인데... 내부 구현을 보면 0이면 PublishSubject로, 1이상이면 ReplaySubject로 구현을 하고 있습니다. 즉, replay가 0인 경우, Element가 이미 방출된 후에 subscription이 발생하면 API 호출을 새로 하게 됩니다.

관련글 더보기

댓글 영역