Observable vs Subject vs Relay
Observable, Subject, Relay는 RxSwift에서 사용하는 기본적인 타입들로, 각각의 역할과 특징이 다릅니다. 이들의 차이를 이해하면 RxSwift를 더 효과적으로 사용할 수 있습니다.
1. Observable
Observable은 RxSwift의 핵심 개념으로, 시간이 지남에 따라 일어나는 일련의 이벤트를 나타냅니다. 이는 주로 데이터를 발행(publish)하고, 그 데이터를 구독(subscribe)하는 메커니즘을 제공합니다.
- 특징:
- 읽기 전용: Observable은 데이터를 발행하지만, 외부에서 직접 값을 추가하거나 수정할 수 없습니다.
- 비동기 스트림: 데이터를 비동기적으로 처리할 수 있습니다.
- 기본 사용 사례: 네트워크 요청, 사용자 입력, 타이머 등 이벤트 기반의 작업.
- 종류:
- Single: 성공 또는 실패를 나타내는 단일 이벤트를 전달합니다.
- Completable: 완료 또는 실패를 나타내는 단일 이벤트를 전달합니다. 데이터는 전달하지 않습니다.
- Maybe: 성공, 실패 또는 완료를 나타내는 단일 이벤트를 전달할 수 있습니다.
- Observable: 0개 이상의 요소를 전달하며, 완료될 수도 있고, 완료되지 않을 수도 있습니다.
2. Subject
Subject는 Observable의 일종이지만, 외부에서 직접 값을 발행할 수 있는 기능을 추가로 제공합니다. 따라서 Subject는 Observable과 Observer의 역할을 동시에 수행할 수 있습니다.
- 특징:
- 다중 구독자: 여러 구독자가 동일한 Subject를 구독할 수 있습니다.
- 상태 변경: 외부에서 직접 값을 발행하거나 상태를 변경할 수 있습니다.
- 종류:
- PublishSubject: 구독을 시작한 이후의 새로운 이벤트만 구독자에게 전달합니다.
- BehaviorSubject: 가장 최근의 값(또는 초기값)을 저장하고, 새로운 구독자에게 그 값을 즉시 전달합니다.
- ReplaySubject: 지정된 버퍼 크기만큼의 최신 이벤트들을 저장하고, 새로운 구독자에게 전달합니다.
- AsyncSubject: Observable이 완료된 후 마지막 이벤트만 구독자에게 전달합니다.
3. Relay
Relay는 Subject의 일종으로, BehaviorRelay와 PublishRelay가 있습니다. Relay는 기본적으로 에러 이벤트를 전달하지 않고, 종료되지 않는 특성을 갖고 있습니다. 이는 UI 이벤트 처리와 같이 앱이 계속해서 동작할 필요가 있는 시나리오에 적합합니다.
- 특징:
- 에러와 완료 이벤트가 없음: Relay는 일반적인 Observable과 달리 에러와 완료 이벤트를 전달하지 않습니다. 이는 종료되지 않는 스트림을 필요로 하는 경우에 유용합니다.
- 상태 유지: Relay는 내부적으로 상태를 유지합니다.
- RxCocoa에서 주로 사용: UI 바인딩을 위해 RxCocoa에서 주로 사용됩니다.
- 종류:
- BehaviorRelay: BehaviorSubject와 유사하게 가장 최신의 값을 유지하고, 초기값을 가질 수 있습니다.
- PublishRelay: PublishSubject와 유사하게 구독 이후의 이벤트만을 전달합니다.
요약
- Observable: 기본적인 비동기 데이터 스트림으로, 읽기 전용이며 데이터를 외부에서 발행할 수 없습니다.
- Subject: Observable과 Observer의 역할을 모두 수행하며, 외부에서 값을 발행할 수 있습니다.
- Relay: Subject의 변형으로, 에러와 완료 이벤트가 없고, 주로 UI 이벤트 처리에 사용됩니다.
각 타입은 특정 상황에 적합하며, RxSwift로 앱을 개발할 때 이들의 차이와 용도를 잘 이해하고 사용하는 것이 중요합니다.
반응형
'TIL (Today I Learned)' 카테고리의 다른 글
[TIL] 2024. 08. 12 (0) | 2024.08.12 |
---|---|
[TIL] 2024. 08. 09 (0) | 2024.08.09 |
[TIL] 2024. 08. 07 (0) | 2024.08.07 |
[TIL] 2024. 08. 06 (0) | 2024.08.06 |
[TIL] 2024. 08. 05 (0) | 2024.08.06 |