본문 바로가기
💡 Today I Learned/스터디 자료정리

[스터디1일차][RxSwift] Observable & Subject

by 솔비님 2024. 10. 7.

 

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. 로그인 상태, 설정 값 등

초기값(분홍색 구)를 가지고 있는 Subject

 

오류 발생 시 오류도 그대로 전달한다

 

 

 

2-3.  PublishSubject

  • 초기값이 없으며 구독 이후에 발생하는 이벤트를 방출한다. 구독 전에 방출된 이벤트는 무시한다
  • 구독 전에 방출된 이벤트는 잃어버릴 수 있기 때문에 모든 항목들의 방출을 보장해야 한다면 항목 배출 전 모든 옵저버가 구독했는지 확인해야한다(Create)
  • 주로 실시간 데이터 스트림을 관리
    ex. 사용자 입력 이벤트(버튼, 제스처 등), 네트워크 응답

구독 전 방출된 이벤트는 무시하는 모습
스트림이 오류로 종료되더라도 오류를 전달한다

 

 

 

2-4.  ReplaySubject

  • 지정된 버퍼 크기(bufferSize)만큼의 이벤트를 저장하고 새로운 구독자가 추가될 때 이벤트를 재생한다
  • 버퍼 크기가 설정되기 때문에 저장할 이벤트 개수가 제한되며, 과거 이벤트를 필요한 만큼 재생(replay)할 수 있다
  • 구독 시점과 관계없이 버퍼에 있는 모든 이벤트를 전달한다
  • 주로 과거 데이터의 재생이 필요한 경우 사용된다
    ex. 최근 메시지, 로그 등 히스토리 형태로 추적이 필요할 때

구독 시점과 관계없이 버퍼에 있는 모든 데이터를 전달 받는다

 

 

 

Subject 사용 시 주의사항

1. 메모리 관리: 구독 해제를 통해 메모리 누수를 방지해야 한다
2. 종료 이벤트 관리: 종료 시점을 명확하게 하여 원하는 시점에 이벤트가 방출될지 말지 결정해야한다

 

'💡 Today I Learned > 스터디 자료정리' 카테고리의 다른 글

[스터디2일차][RxSwift] 연산자  (1) 2024.10.11