Swift/RxSwift

RxSwift Observable, Subjects and Relays

iosswift 2022. 10. 1. 23:57

 

Subject

Observable 이면서 observer 일 수 있음.

(== 데이터를 방출 (emit), 구독 (subscribe) 할 수 있음. ) 

 

PublishSubject: empty 로 시작해서 subscribers 에게만 새로운 elements 를 emit 

BehaviorSubject: 초기값을 가짐. 초기 값 또는 가장 최근 element 를 new subscribers 에게 emit 해줌(replay)

ReplaySubject: buffer size 만큼 초기화 되고, 해당 size 만큼의 element 를 지니고 있다가 new subscribers 에게 emit 

AsyncSubject: subject 가 complete event 를 받을 때만 가장 마지막 next event 값을 emit. (거의 사용하지 않음)

 

 

Relay

PublishRelay, BehaviorRelay: 각각 wrap PublishSubject, BejaviorSubject. Next events 를 accept, relay 만 할 수 있음. 

Relay 에 대해서 completed, error event 를 넣어줄 수는 없음. 그러므로 끝나지 않는 sequences 상황에서 매우 유용함. 

 

 

 

 

----------------------------------------------------------------------------------------------------------------------

 

 

 

PublishSubject

Subscribe 한 시점 부터 unsubscribe 또는 complete, error 로 끝날때 까지

새로운 event 에 대해 notified 받기를 원할 때 사용하기 유용함.

 

How Publish Subject works

 

1번째 Line 은 Publish Subject, 2,3 번째 Line 은 Subscribers.

또한 위로 향하는 화살표는 'subscription' 을, 아래로 향하는 화살표는 'emitting event'. 이다.

 

event 1 이 추가 된 후 두번째 line 이 subscription 했을 때, publish subject 는 아무런 값도 방출하지 않는다.

대신, 그 후 event 2 가 추가되었을 때 두번째 line 에게 event 2 를 방출한다.

 

 

BehaviorSubject

PublishSubject 와 비슷하게 작동하지만, 가장 최근에 추가한 값 새로운 subscribers 에게 emit 한다는 점에서 큰 차이가 있다. 

 

How Behavior Subject works

위 PublishSubject 에서와 화살표, Lines 의 의미는 동일하다.

다만, 이때는 두번째 Line 이 Subscription 했을 때 즉시 초기 값 event 1 을 emit 한다는 것,

동일하게 세번째 Line 이 Subscription 했을 때 즉시 가장 최근 값 event 2 을 emit 한다는 것 이 PublishSubject와 다른 점이다. 

 

 

 

ReplaySubject

본인이 원하는 만큼 크기의 buffer 를 이용해서 최근 elements 를 저장 후 새로운 subscriber 에서 방출해준다. 

 

두번째 Line 은 이미 ReplaySubject 를 Subscription 한 상태이다.

event 1, 2 가 잇따라 추가된 후, 나중에 세번째 Line 이 Subscription 을 하게되면 (2 이상의 size 를 지정해주었다고 가정) 이전 2개 이벤트가 바로 방출되게 된다.

 

 

 

Relays 

위 marble diagrams 에서, 마무리 세로선이 없는 경우를 생각하면 된다. (Error, Complete event 는 일어날 수 없음.)