💡 Disposable
dispose를 호출하지 않으면 발생하는 경고
subscribe의 반환 값이 Disposable이다.
언젠가는 리소스가 정리되어야 한다는 의미
때문에 dispose를 호출하지 않으면 경고 문구가 나타나는 것이다.
next 이벤트가 방출되면, completed와 disposed가 순서대로 실행되고 리소스를 정리한다.
BehaviorSubject는 observable과 observer 역할을 모두 하기 때문에 언제 어떤 이벤트가 올지 모른다.
언제든 이벤트가 emit될 수 있는 상황이기 때문에 disposed 되지 않고, 메모리 상에 남아있게 된다.
error 이벤트를 만나게 되면 바로 리소스 정리를 시작한다.
때문에 error 이벤트 전달 이후의 next 이벤트는 동작하지 않는다.
observer를 상수에 담으면 필요한 시점에 직접 리소스 정리를 할 수 있다.
옵저버의 반환 값은 Disposable
필요한 시점에 .dispose()로 리소스 정리
Diposable 프로포콜 내에 dispose 메서드를 호출하여 리소스 정리하는 것
next → emit
complete, error → Disposable의 dispose 호출
viewcontroller가 deinit되는 시점에 disposebag이 dispose()를 호출한다.
일반적으로는 클래스 메모리가 해제되는 시점에 Disposable이 되지만, 클래스가 RootViewController일 때는 메모리에서 Disposable이 되지 않는다.
이러한 경우 직접 리소스를 관리하여 필요한 시점에 dispose 메서드 호출로 리소스를 정리해야 한다.
✅ 리소스 정리 방식
- dispose()를 직접 호출하거나나
- DisposeBag deinit을 활용하여 리소스 정리
onDisposed()는 명시적으로 dispose를 호출했을 때 실행된다.
1초마다 계속해서 호출되는 옵저버
리소스 정리 시점은 back 버튼 눌러서 뷰컨이 deinit되는 시점이다.
disposebag 인스턴스를 교체해서 여러 이벤트를 한번에 dispose 할 수 있다.
💡 Subject 종류
✅ PublishSubject
✅ BehaviorSubject
behaviorsubject는 subcribe 이전에 가장 최신에 방출한 이벤트 하나를 버퍼에 저장하고 있다.
🔎 BehaviorSubject와 PublishSubject 차이
- 초기 값 설정 여부
- 구독 이전의 next 이벤트 처리 방식
✅ ReplaySubject
subscribe 이전에 전달한 이벤트를 buffersize 만큼 가지고 있다가, subscribe 하고 나면 방출한다.
오류가 발생하더라도 메모리에서 보유하고 있는 이벤트를 emit하고 error를 notification 한다.
너무 큰 buffersize는 메모리 부하가 발생할 수 있다.
✅ AsyncSubject
complete이벤트를 만나야 이벤트가 emit 된다.
다른 subject와는 다르게 구독 즉시 이벤트 전달이 되지 않는다.
complete가 발생했을 때 가장 최근 시점의 next 이벤트 하나가 방출된다
💡 Operator
✅ CombineLatest
2개 이상의 Observable을 결합하여 하나의 Observable로 만든다.
최대 8개
두가지 조건을 결합하고자 할 때 combineLatest를 사용한다.
combineLatest는 결합하려는 이벤트가 최소 한 번씩은 방출되어야 구독을 시작한다.
publishSubject는 초기 값이 없기 때문에 비교하려는 값들이 최소 한번은 next 이벤트가 방출되어야 combineLatest를 수행한다.
b의 next 이벤트가 최소 한번 방출되어야 combineLatest를 수행
b의 값이 초기화되지 않아서 combineLatest를 수행하지 않는다.
→ 아무 결과도 나오지 않음
'iOS > 🌱 SeSAC' 카테고리의 다른 글
DailyPin - 출시 프로젝트 회고 (0) | 2023.11.04 |
---|---|
23.11.03 금 (1) | 2023.11.04 |
23.11.01 수 (1) | 2023.11.01 |
23.10.31 화 (0) | 2023.11.01 |
23.09.01 금 (0) | 2023.09.01 |