iyOmSd/Title: RxSwift

[RxSwift] Observable, Subject, Relay

냄수 2020. 6. 27. 00:57
반응형

Subject란

Observable에 값을 추가하고 방출할 수 있도록해주는 기능이에요

즉, Observable(방출자)이자 Observer(구독자)의 역할을 모두할 수 있다고 생각하면되요

Cold Observable을 Hot하게 만들어 줄 수 있다고 해요

 

Hot Observable

생성과 동시에 이벤트를 방출

처음생성된 이벤트 부터 받지못하고 중간부터 나온 이벤트부터 구독가능

여러 Observer가 하나의 Observable을 공유 가능

publish, replay ... 등 Subject타입

 

(이벤트 방출시작) 1 2 3 4 (구독시작) 5 6 7

이런식으로 스트림이 존재하고

구독시작시 1 2 3 4의 이벤트는 받지 못하는거에요

 

 

Cold Observable

구독되는 시점부터 이벤트를 방출

처음부터 방출된 이벤트를 모두 구독할 수 있음

Observer마다 별도의 Observable 인스턴스가짐

Observable타입

 

(구독시작, 이벤트방출시작) 1 2 3 4 5

구독시작시 이벤트가 오기시작해서 처음부터 모든 데이터를 받을 수 있어요

 

그럼 Observable과 같은거 아닌가요..?!

기능은 비슷하지만 차이가 있어요

Observable은 하나의 구독만 할 수 있지만(unicast)

Subject는 구독을 여러개 추가할 수 있어요(muticast)

 

Subject

PublishSubject

생성시 초기값이없어요

이벤트 발생시 값을 받을 수 있어요

 

BehaviorSubject

생성시 초기값 넣어줘야해요

구독시 값이없다면 디폴트값을 받구요

있다면 최근값을 받아요

 

ReplaySubject

구독시 그 이전에 발생한 값을 다받을 수 있어요

 

AsyncSubject

complete시에 가장 마지막 데이터를 받아요

 

 

저는 이중에서 BehaviorSubject와 PublishSubject를 많이사용했었구요

Subject를 래핑해서 쓰는

Relay라는 개념이있어요

 

Relay

import RxCocoa를 해주시구요 ( Subject는 RxSwift에 있어요 )

error, complete가없어요!!

Dispose되기 전까지 계속 동작해요

 

Subject에서 onNext()로 이벤트를 발생시켰다면

Relay는 accept()로 이벤트를 발생시켜요

 

error가 없기때문에 에러나도 무시되니까 죽지않겠죠 따라서 스트림이 종료가 안될거에요

UI를 그리는데 적합해요

에러낫다고 꺼져서 안 그릴 수도 있는 상황이 안생기고 계속 살아있는거죠

 

Relay의 value는 get-only ( Subject의 value는 set, get이 가능해요 )

Subject를 Wrapper한 형식이구요

코드에 보이는것과 같이

각 Relay는 Subject를 래핑했기때문에

사용되는 특성은 같아요

 

PublishRelay는

PublishSubject를 Wrapper

 

BehaviorRelay는

BehaviorSubject를 Wrapper

 

반응형