brunch

You can make anything
by writing

C.S.Lewis

by 으아한구렝 Feb 25. 2018

3. Subjects

제 이해의 흐름입니다. 부정확한 부분을 지적해주세요.

누군가 읽는다면 말입니다.


What you want is something that can act as both an observable and as an observer. And that something is called a Subject.


4가지 타입의 Subject를 소개하고 있습니다.

PublishSubject: Empty 상태로 생성할 수 있으며, Subscriber들에게 새로운 element들만 emit합니다. 이전 챕터에서의 예제를 보면 Observable 초기화 시에 줬던 element들을 subscribe함과 동시에 바로 받았지만, PublishSubject는 subscribe한 후에 발생하는 element만 emit합니다.

BehaviorSubject: Initial Event가 있어야 생성할 수 있으며, Subscriber들에게 가장 마지막 element만 emit합니다. 아마도 그래서 Initial Event가 반드시 필요한 것이겠죠.

ReplaySubject: 생성 시 버퍼 사이즈를 지정해야 하며, 최대 버퍼 사이즈만큼의 element들을 가지고 있다가 subscribe이 발생할 때마다 emit합니다.

Variable: BehaviorSubjecet의 Wrapper라고 합니다. current value를 state로 보고, subscribe이 발생할 때마다 state를 emit합니다. 하지만 error를 받아도 종료되지 않고 dealloc 시점에 complete됩니다.


Challenges2

막상 ChallengeProject를 열어서 코드를 실행해보면 콘솔에 deprecation warning 메시지가 표시됩니다. Variable이 deprecate되었고 대신 RxCocoa.BehaviorRelay 사용을 고려하라는 내용입니다. BehaviorRelay 역시 BehaviorSubject의 wrapper이긴 마찬가지입니다.

[DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx

링크에도 소스에도 구구절절한 사유가 적혀있었습니다.

* `Variable` isn't a standard cross platform concept, hence it's out of place in RxSwift target.
* It doesn't have a counterpart for handling events (`PublishRelay`). It models state only.
* It doesn't have a consistent naming with *Relay or other Rx concepts.
* It has an inconsistent memory management model compared to other parts of RxSwift (completes on `deinit`).



의문점 / 공부할 부분

Observable이면서 Observer라고 말은 하지만, 전 아직 Subscriber에만 관심이 쏠려있는 것 같습니다. (사용법만 신경써서 그런건가...) Observable과 Observer의 역할을 Subject가 다 해낸다한들 어차피 중요한 부분은 Subscriber가 아닌가 하는 것이죠.

모든 것은 Sequence라고 했는데, 계속 용어를 정확히 구분해서 쓰고 있는지 의문이 듭니다.

작가의 이전글 presentedViewController
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari