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
'iyOmSd > Title: RxSwift' 카테고리의 다른 글
[RxSwift] Observable? Driver? Relay? 알아보기 (0) | 2020.10.28 |
---|---|
[RxSwift] bind, subscribe, drive (1) | 2020.10.03 |
[RxSwift] TableView 구현하기 (0) | 2020.06.05 |
[RxSwift] Combine Operator정리 - CombineLatest, Merge, Zip (0) | 2020.05.30 |
[RxSwift] RxDataSources을 이용한 TableView구현하기 (0) | 2020.01.21 |