iOS Development/RxSwift

[RxSwift] Observable, Trait, Subject

se0m 2024. 4. 12. 20:41

Observable

생명주기

 

next, completed, error 이벤트를 표현하는 Marble 다이어그램

 

  • Observable은 어떤 구성 요소를 가지는 next 이벤트를 계속해서 방출할 수 있음

 

  • Observable은 이벤트가 완전히 종료되었음을 나타내는 이벤트를 방출할 수 있음
    • | : completed 이벤트
    • X : error 이벤트(Swift.Error 인스턴스를 갖고 있음)

 

 


Trait

코드의 가독성을 높이기 위해 좁은 범위의 Observable 사용 → 즉 Observable의 제한된 버전이라고 생각하면 됨

 

Single

 

 

  • success 또는 error 이벤트를 한 번만 방출

 

  • success = next + completed
    • 파일의 저장이나 다운로드, 디스크에서 데이터 로딩 등과 같이 기본적으로 값을 산출하는 비동기적 연산에 사용
    • ex. 사진을 저장하는 Observable에서 사진 저장에 성공했는지 혹은 실패했는지에 대해 정확히 한 가지의 요소만을 방출하는 연산자를 맵핑할 때 유용
// 1
Observable
    .asSingle
    .~
    
// 2
Single
    .~

 

Maybe

 

 

  • Single과 비슷하지만 유일하게 다른 점은 아무런 값을 방출하지 않는 completed를 포함한다는 것
    • ex. 커스텀한 사진 앨범에서 만든 앨범에 대한 ID를 UserDefaults에 저장하고 Maybe 메서드를 통해 상태 관리를 한다면 → 앨범 검색 시 해당 ID가 존재한다면 그냥 completed 이벤트를 방출하고 앨범을 생성하거나 삭제하는 경우는 앨범 ID와 함께 success 이벤트를 방출할 수 있기 때문에 UserDefaults로 ID에 대한 관리가 가능함
// 1
Observable
    .asMaybe
    .~
    
// 2
Maybe
    .~

 

Completable

 

 

  • Completable은 어떠한 값도 방출하지 않음

 

  • Single, Maybe와 달리 Observable을 Completable로 바로 바꿀 수 없음
    • completed, error 이벤트만을 방출하기 때문에 값 요소를 방출하는 Observable로 변환 불가

 

  • 동기식 연산의 성공 여부를 확인할 때 유용
    • ex. 사용자가 어떤 작업을 수행하는 동안 어떠한 데이터가 자동으로 저장되는 기능에서 백그라운드 큐에서 비동기적으로 작업을 한 다음에 완료가 되면 노티나 알럿을 표시 → 완료 여부만 확인하면 되기 때문에 값이 필요 없음

 


Subject

  • Observable이자 Observer
  • 실시간으로 Observable에 새로운 값을 추가하고 subscriber에게 방출할 수 있음

 

PublishedSubject

 

1번째 줄: PublishedSubject(아래 방향 화살표: 이벤트 방출 / 위 방향 화살표: 구독 선언)

 

  • 빈 상태로 시작하여 새로운 값만을 subscriber에게 방출
  • 구독된 순간 새로운 이벤트 수신을 알리고 싶을 때 용이함

 

BehaviorSubject

 

2번째 줄 구독자는 1 이벤트가 방출된 뒤에 구독했지만 직전의 값인 1 이벤트를 받음

 

  • 하나의 초기값을 가진 상태로 시작하고 새로운 subscriber에게 직전의 값(최신값)을 방출
  • 마지막 next 이벤트를 새로운 subscriber에게 반복한다는 점을 제외하면 PublishedSubject와 유사함

 

ReplaySubject

 

1번째 줄: 버퍼 사이즈가 2인 ReplaySubject / 2번째 줄: Subject를 생성할 때부터 구독하므로 처음부터 이벤트를 받음 / 3번째 줄: 구독하는 시점에서 버퍼 사이즈만큼 이벤트를 받음

 

  • 버퍼를 두고 초기화하며 버퍼 사이즈만큼의 값들을 유지하면서 새로운 subscriber에게 방출
  • Subject를 생성할 때 선택한 특정 크기까지 최신 요소를 일시적으로 버퍼로 저장하고 subscriber가 생길 때마다 방출
  • 버퍼는 메모리가 가지고 있어 이미지나 대량의 배열같이 메모리를 크게 차지하는 값들을 가지는 큰 사이즈의 버퍼를 생성하는 경우 메모리의 부하가 커짐