1. Observable
비동기적으로 데이터를 방출하는 데이터 소스이며 여러 이벤트를 통해 데이터를 전달함
구독자(Observer)는 Observable을 관찰(구독 Subscribe)하고 있다가 전달되는 이벤트를 처리한다
1-1. 전달되는 주요 이벤트
onNext | 새로운 데이터를 방출할 때마다 호출됨 |
onError | 에러 방출 후 더이상 데이터를 방출하지 않음 |
onCompleted | 오류가 발생하지 않았다면 마지막 onNext를 호출한다. 더이상 이벤트가 발생하지 않는다 |
→ onError, onCompleted는 Observable 라이프사이클 가장 마지막에 전달된다.
Observable이 종료되면 모든 리소스가 정리되기 때문에 다른 이벤트가 전달되지 못하며, error, complete 발생 시 dispose가 호출되어 스트림이 종료된다
→ 즉, Observable 재사용 불가
→ 연결된 UI 요소 처리 시 error가 발생할 경우 스트림이 종료되어 바인딩이 끊어져 업데이트가 진행되지 않는다
그럼, Observable은 데이터를 언제 방출할까?
1-2. Hot Observable & Cold Observable
- Hot Observable : Observable이 생성되자 마자 방출할 수 있다. 구독자들은 데이터가 방출되는 중간부터 구독할 수 있다
- Cold Observable : 구독자가 구독을 시작하면 데이터를 방출한다. 구독자는 배출하는 항목 전체를 구독할 수 있도록 보장받는다
1-3. Observable 생성 방법
- just : 하나의 값을 방출하고 종료하는 옵저버블을 생성
- of : 여러 개의 값을 순차적으로 방출하는 옵저버블 생성
- from : 배열과 같은 시퀀스 형태의 데이터를 방출 / 배열의 각 요소가 개별적으로 방출
- creat : 커스텀 옵저버블 생성 / 개발자가 직접 호출하여 이벤트 방출
2. Subject
Subject는 데이터 스트림을 외부에서 제어할 수 있는 Observable이다
실시간 데이터와 이벤트를 관리할 수 있고 다른 데이터 스트림과 상호작용 할 수 있다
옵저버이면서도 옵저버블이기 때문에 이벤트를 수신하고 방출할 수 있는 기능을 동시에 가지고 있다
2-1. AsyncSubject
- 스트림이 완료된 후 마지막 이벤트(가장 최근 값)만 방출한다. onCompleted가 호출되지 않으면(스트림이 완료되지 않으면) 구독자는 값을 받지 못한다
- 주로 비동기 작업의 결과를 처리할 때 사용된다
ex. 네트워크 요청 완료 후의 데이터 전달, 복잡한 계산의 마지막 결과만 필요할 때
2-2. BehaviorSubject
- 초기값을 가지며 구독자가 추가될 때 현재 값을 즉시 방출하고 이후 이벤트를 방출한다
- 주로 상태를 계속 추적해야 하는 상황과 관리에 사용됨
ex. 로그인 상태, 설정 값 등
2-3. PublishSubject
- 초기값이 없으며 구독 이후에 발생하는 이벤트를 방출한다. 구독 전에 방출된 이벤트는 무시한다
- 구독 전에 방출된 이벤트는 잃어버릴 수 있기 때문에 모든 항목들의 방출을 보장해야 한다면 항목 배출 전 모든 옵저버가 구독했는지 확인해야한다(Create)
- 주로 실시간 데이터 스트림을 관리
ex. 사용자 입력 이벤트(버튼, 제스처 등), 네트워크 응답
2-4. ReplaySubject
- 지정된 버퍼 크기(bufferSize)만큼의 이벤트를 저장하고 새로운 구독자가 추가될 때 이벤트를 재생한다
- 버퍼 크기가 설정되기 때문에 저장할 이벤트 개수가 제한되며, 과거 이벤트를 필요한 만큼 재생(replay)할 수 있다
- 구독 시점과 관계없이 버퍼에 있는 모든 이벤트를 전달한다
- 주로 과거 데이터의 재생이 필요한 경우 사용된다
ex. 최근 메시지, 로그 등 히스토리 형태로 추적이 필요할 때
Subject 사용 시 주의사항
1. 메모리 관리: 구독 해제를 통해 메모리 누수를 방지해야 한다
2. 종료 이벤트 관리: 종료 시점을 명확하게 하여 원하는 시점에 이벤트가 방출될지 말지 결정해야한다
'💡 Today I Learned > 스터디 자료정리' 카테고리의 다른 글
[스터디7일차] 객체지향 & 프로토콜 (0) | 2024.11.12 |
---|---|
[스터디6일차] 테스트 코드👩🏻🔧 (1) | 2024.10.30 |
[스터디5일차] MVVM 패턴 (0) | 2024.10.25 |
[스터디4일차][RxSwift] RxCocoa (1) | 2024.10.22 |
[스터디2일차][RxSwift] 연산자 (1) | 2024.10.11 |