RxSwift

[iOS / RxSwift] Subject

Minny27 2022. 9. 13. 00:23

Subject

A Subject is a sort of bridge or proxy that is available in some implementations of ReactiveX that acts both as an observer and as an Observable. Because it is an observer, it can subscribe to one or more Observables, and because it is an Observable, it can pass through the items it observes by reemitting them, and it can also emit new items.

Subject는 observer와 Observable 모두로 작동하는 일부 ReactiveX 구현에서 사용할 수 있는 일종의 브리지 또는 프록시입니다. 옵저버이기 때문에 하나 이상의 옵저버블을 구독할 수 있고 옵저버블이기 때문에 관찰한 항목을 다시 방출하여 통과할 수 있으며 새 아이템을 방출할 수도 있습니다.

 

Because a Subject subscribes to an Observable, it will trigger that Observable to begin emitting items (if that Observable is “cold” — that is, if it waits for a subscription before it begins to emit items). This can have the effect of making the resulting Subject a “hot” Observable variant of the original “cold” Observable.

Subject가 Observable을 구독하기 때문에 Observable이 항목 방출을 시작하도록 트리거합니다(그 Observable이 "cold"인 경우, 즉 항목을 방출하기 시작하기 전에 구독을 기다리는 경우). 이것은 결과 Subject를 원래 "cold" Observable의 "hot" Observable 변형으로 만드는 효과를 가질 수 있습니다.

 

Varieties of Subject(Subject의 종류)

There are four varieties of Subject that are designed for particular use cases. Not all of these are available in all implementations, and some implementations use other naming conventions (for example, in RxScala, what is called a “PublishSubject” here is known simply as a “Subject”):

특정 사용 사례를 위해 설계된 4가지 종류의 Subject가 있습니다. 이 모든 것이 모든 구현에서 사용할 수 있는 것은 아니며 일부 구현에서는 다른 명명 규칙을 사용합니다(예: RxScala에서는 여기에서 "PublishSubject"라고 하는 것을 단순히 "Subject"라고 함).

 

AsyncSubject

An AsyncSubject emits the last value (and only the last value) emitted by the source Observable, and only after that source Observable completes. (If the source Observable does not emit any values, the AsyncSubject also completes without emitting any values.)

AsyncSubject는 source Observable이 내보낸 마지막 값(그리고 마지막 값만)을 내보냅니다. (소스 Observable이 값을 내보내지 않으면 AsyncSubject도 값을 내보내지 않고 완료됩니다.)

 

It will also emit this same final value to any subsequent observers. However, if the source Observable terminates with an error, the AsyncSubject will not emit any items, but will simply pass along the error notification from the source Observable.

또한 후속 관찰자에게 동일한 최종 값을 내보냅니다. 그러나 소스 Observable이 오류로 종료되면 AsyncSubject는 항목을 내보내지 않고 단순히 소스 Observable의 오류 알림을 전달합니다.

 

BehaviorSubject

When an observer subscribes to a BehaviorSubject, it begins by emitting the item most recently emitted by the source Observable (or a seed/default value if none has yet been emitted) and then continues to emit any other items emitted later by the source Observable(s).

observer가 BehaviorSubject를 구독할 때, 소스 Observable에서 가장 최근에 내보낸 항목(또는 아직 내보내지 않은 경우 시드/기본값)을 내보내는 것으로 시작한 다음 소스 Observable에서 나중에 내보낸 다른 항목을 계속 내보냅니다.

 

However, if the source Observable terminates with an error, the BehaviorSubject will not emit any items to subsequent observers, but will simply pass along the error notification from the source Observable.

그러나 소스 Observable이 오류로 종료되면 BehaviorSubject는 후속 관찰자에게 항목을 내보내지 않고 단순히 소스 Observable의 오류 알림을 전달합니다.

 

PublishSubject

PublishSubject emits to an observer only those items that are emitted by the source Observable(s) subsequent to the time of the subscription.

PublishSubject는 구독 시간 이후에 소스 Observable(들)에 의해 방출된 항목만 관찰자에게 방출합니다.

 

Note that a PublishSubject may begin emitting items immediately upon creation (unless you have taken steps to prevent this), and so there is a risk that one or more items may be lost between the time the Subject is created and the observer subscribes to it. If you need to guarantee delivery of all items from the source Observable, you’ll need either to form that Observable with Create so that you can manually reintroduce “cold” Observable behavior (checking to see that all observers have subscribed before beginning to emit items), or switch to using a ReplaySubject instead.

PublishSubject는 생성 즉시 항목을 방출하기 시작할 수 있으며(이를 방지하기 위한 조치를 취하지 않는 한) Subject가 생성되고 관찰자가 구독하는 시간 사이에 하나 이상의 항목이 손실될 위험이 있습니다. 소스 Observable에서 모든 항목의 전달을 보장해야 하는 경우 "콜드" Observable 동작을 수동으로 다시 도입할 수 있도록 Create을 사용하여 해당 Observable을 구성해야 합니다(항목 방출을 시작하기 전에 모든 관찰자가 구독했는지 확인) 또는 대신 ReplaySubject를 사용하도록 전환합니다.

 

If the source Observable terminates with an error, the PublishSubject will not emit any items to subsequent observers, but will simply pass along the error notification from the source Observable.

소스 Observable이 오류로 종료되면 PublishSubject는 후속 관찰자에게 항목을 내보내지 않고 단순히 소스 Observable의 오류 알림을 전달합니다.

 

ReplaySubject

ReplaySubject emits to any observer all of the items that were emitted by the source Observable(s), regardless of when the observer subscribes.

ReplaySubject는 관찰자가 구독하는 시기에 관계없이 소스 Observable에서 방출한 모든 항목을 관찰자에게 방출합니다.

 

There are also versions of ReplaySubject that will throw away old items once the replay buffer threatens to grow beyond a certain size, or when a specified timespan has passed since the items were originally emitted.

재생 버퍼가 특정 크기 이상으로 커질 위험이 있거나 항목이 원래 방출된 이후 지정된 시간이 경과하면 오래된 항목을 버리는 ReplaySubject 버전도 있습니다.

 

If you use a ReplaySubject as an observer, take care not to call its onNext method (or its other on methods) from multiple threads, as this could lead to coincident (non-sequential) calls, which violates the Observable contract and creates an ambiguity in the resulting Subject as to which item or notification should be replayed first.

ReplaySubject를 관찰자로 사용하는 경우 여러 스레드에서 onNext 메서드(또는 다른 메서드)를 호출하지 않도록 주의하십시오. 이 경우 동시 호출(순차적이지 않음)이 발생할 수 있으며, 이는 Observable 계약을 위반하고 결과 Subject에 어떤 아이템 또는 알림을 먼저 재생해야 하는지에 대한 모호성을 발생시킬 수 있습니다.

 

 

 

※ 참고 출처

ReactiveX 공식 문서

 

ReactiveX - Subject

If you have a Subject and you want to pass it along to some other agent without exposing its Subscriber interface, you can mask it by calling its asObservable method, which will return the Subject as a pure Observable. See Also

reactivex.io

'RxSwift' 카테고리의 다른 글

[iOS / RxSwift] Single  (1) 2022.09.12
[iOS / RxSwift] Operators  (0) 2022.09.02
[iOS / RxSwift] Observable  (0) 2022.09.01