RxSwift를 사용하면서 공부한 내용을 정리한 글입니다.
1. Disposing
1) 개요
Disposable
타입의dispose()
메서드를 통해 원하는 시기에 Observable Sequence를 종료하고
메모리에 할당된 subscription 리소스를 해제할 수 있다.- 그러나
dispose()
메서드를 수동으로 호출하는 것은 좋은 방법이 아니며DisposeBag
클래스를 사용해 리소스를 정리하는 방법이 있다.
일반적인 Observable Sequence는 completed 또는 error 이벤트를 방출하여
정상적으로 종료됐을 때 메모리에서 해제된다.
하지만 버튼 탭 처럼 자연스럽게 종료되지 않는 Sequence의 경우 직접 리소스를 정리해줘야한다.
2) DisposeBag
DisposeBag
은 Disposable 인스턴스에 대한 참조를 유지한다.DisposeBag
인스턴스가 메모리에서 해제될 때 해당 인스턴스에 추가된 모든Disposable
의dispose()
메서드를 호출함으로써 리소스를 한 번에 정리할 수 있다.- 만약 즉시 모든 리소스를 정리하고 싶다면 기존
disposeBag
프로퍼티에
새로운DisposeBag
인스턴스를 할당하여 기존 인스턴스에 대한 참조를 없앨 수 있다.
2. Subject
1) 개요
Subject
는 Observable과 Observer의 역할을 동시에 수행할 수 있는 객체이다.Subject
는 Observer이기 때문에 하나 이상의 Observable을 subscribe할 수 있고
동시에 Observable이기 때문에 관찰한 값을 다시 Observer에게 방출할 수 있다.Subject
는 Observable과 다르게 subcribe마다 새로운 Sequence를 생성하는게 아니라
만든 Sequence를 내부적으로 공유한다.
2) 종류
모든 Subject
객체는 자신이 관찰한 이벤트를 등록된 모든 Observer(subscriber)에게 방출함.
단, 종류마다 약간의 차이점이 존재한다.
Subject는 자동으로 completed 이벤트를 방출하지 않는다.
- Publish
- subscribe 이후부터 전달받은 이벤트를 Observer에게 방출
- subscribe 이전에 전달받은 이벤트는 무시된다.
- Behavior
- 새로운 Observer를 subscribe할 때 가장 최근에 전달받은 이벤트를 새로운 Observer에게 방출
- 가장 최근 이벤트가 없다면 Behavior 객체 생성 시 전달한 초깃값을 방출
- Replay
- 새로운 Observer를 subscribe 할 때 Replay 객체 생성 시 전달한 버퍼 사이즈의 수 만큼
이전 이벤트들을 새로운 Observer에게 방출 - completed 또는 error 이벤트를 받아 Sequence가 종료되더라도 새로운 Observer를
subscribe 했을 때 버퍼에 저장하고 있던 이벤트를 모두 방출한다.
- 새로운 Observer를 subscribe 할 때 Replay 객체 생성 시 전달한 버퍼 사이즈의 수 만큼
- Async
- AsyncSubject는 completed 이벤트를 전달받기 전까지는
등록된 모든 Observer에게 아무 이벤트도 전달하지 않는다. - AsyncSubject는 completed 이벤트를 전달받았을 때 가장 최근에 전달받았던
next 이벤트 하나를 등록된 모든 Observer에게 전달한다.
- AsyncSubject는 completed 이벤트를 전달받기 전까지는
'RxSwift' 카테고리의 다른 글
[RxSwift] RxSwift 톺아보기 - 1 (0) | 2022.10.31 |
---|