iOS Development/RxSwift
[RxSwift] Observable, Trait, Subject
se0m
2024. 4. 12. 20:41
Observable
생명주기
- 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
- 빈 상태로 시작하여 새로운 값만을 subscriber에게 방출
- 구독된 순간 새로운 이벤트 수신을 알리고 싶을 때 용이함
BehaviorSubject
- 하나의 초기값을 가진 상태로 시작하고 새로운 subscriber에게 직전의 값(최신값)을 방출
- 마지막 next 이벤트를 새로운 subscriber에게 반복한다는 점을 제외하면 PublishedSubject와 유사함
ReplaySubject
- 버퍼를 두고 초기화하며 버퍼 사이즈만큼의 값들을 유지하면서 새로운 subscriber에게 방출
- Subject를 생성할 때 선택한 특정 크기까지 최신 요소를 일시적으로 버퍼로 저장하고 subscriber가 생길 때마다 방출
- 버퍼는 메모리가 가지고 있어 이미지나 대량의 배열같이 메모리를 크게 차지하는 값들을 가지는 큰 사이즈의 버퍼를 생성하는 경우 메모리의 부하가 커짐