23.11.02 목

2023. 11. 3. 00:40·Study/🌱 SeSAC

💡 Disposable

Untitled.png

dispose를 호출하지 않으면 발생하는 경고

Untitled.png

subscribe의 반환 값이 Disposable이다.

언젠가는 리소스가 정리되어야 한다는 의미

때문에 dispose를 호출하지 않으면 경고 문구가 나타나는 것이다.

 

Untitled.pngUntitled.png

next 이벤트가 방출되면, completed와 disposed가 순서대로 실행되고 리소스를 정리한다.

 

 

Untitled.pngUntitled.png

BehaviorSubject는 observable과 observer 역할을 모두 하기 때문에 언제 어떤 이벤트가 올지 모른다.

언제든 이벤트가 emit될 수 있는 상황이기 때문에 disposed 되지 않고, 메모리 상에 남아있게 된다.

 

 

Untitled.pngUntitled.png

error 이벤트를 만나게 되면 바로 리소스 정리를 시작한다.

때문에 error 이벤트 전달 이후의 next 이벤트는 동작하지 않는다.

 

 

Untitled.png

observer를 상수에 담으면 필요한 시점에 직접 리소스 정리를 할 수 있다.

 

Untitled.pngUntitled.png

옵저버의 반환 값은 Disposable

필요한 시점에 .dispose()로 리소스 정리

 

 

Untitled.png

Diposable 프로포콜 내에 dispose 메서드를 호출하여 리소스 정리하는 것

 

next → emit

complete, error → Disposable의 dispose 호출

 

 

Untitled.png

viewcontroller가 deinit되는 시점에 disposebag이 dispose()를 호출한다.

 

일반적으로는 클래스 메모리가 해제되는 시점에 Disposable이 되지만, 클래스가 RootViewController일 때는 메모리에서 Disposable이 되지 않는다.

이러한 경우 직접 리소스를 관리하여 필요한 시점에 dispose 메서드 호출로 리소스를 정리해야 한다.

 

✅ 리소스 정리 방식

  • dispose()를 직접 호출하거나나
  • DisposeBag deinit을 활용하여 리소스 정리

onDisposed()는 명시적으로 dispose를 호출했을 때 실행된다.

Untitled.pngUntitled.png

1초마다 계속해서 호출되는 옵저버

리소스 정리 시점은 back 버튼 눌러서 뷰컨이 deinit되는 시점이다.

 

 

disposebag 인스턴스를 교체해서 여러 이벤트를 한번에 dispose 할 수 있다.

Untitled.pngUntitled.png

 

💡 Subject 종류

✅ PublishSubject

Untitled.pngUntitled.png

 

✅ BehaviorSubject

Untitled.pngUntitled.png

behaviorsubject는 subcribe 이전에 가장 최신에 방출한 이벤트 하나를 버퍼에 저장하고 있다.

 

🔎 BehaviorSubject와 PublishSubject 차이

  • 초기 값 설정 여부
  • 구독 이전의 next 이벤트 처리 방식

 

✅ ReplaySubject

Untitled.pngUntitled.png

subscribe 이전에 전달한 이벤트를 buffersize 만큼 가지고 있다가, subscribe 하고 나면 방출한다.

오류가 발생하더라도 메모리에서 보유하고 있는 이벤트를 emit하고 error를 notification 한다.

너무 큰 buffersize는 메모리 부하가 발생할 수 있다.

 

✅ AsyncSubject

Untitled.pngUntitled.png

complete이벤트를 만나야 이벤트가 emit 된다.

다른 subject와는 다르게 구독 즉시 이벤트 전달이 되지 않는다.

complete가 발생했을 때 가장 최근 시점의 next 이벤트 하나가 방출된다

 

💡 Operator

✅ CombineLatest

2개 이상의 Observable을 결합하여 하나의 Observable로 만든다.

Untitled.png

최대 8개

 

Untitled.pngUntitled.png

두가지 조건을 결합하고자 할 때 combineLatest를 사용한다.

 

Untitled.pngUntitled.png

combineLatest는 결합하려는 이벤트가 최소 한 번씩은 방출되어야 구독을 시작한다.

 

 

Untitled.pngUntitled.png

publishSubject는 초기 값이 없기 때문에 비교하려는 값들이 최소 한번은 next 이벤트가 방출되어야 combineLatest를 수행한다.

b의 next 이벤트가 최소 한번 방출되어야 combineLatest를 수행

 

 

Untitled.png

b의 값이 초기화되지 않아서 combineLatest를 수행하지 않는다.

→ 아무 결과도 나오지 않음

'Study > 🌱 SeSAC' 카테고리의 다른 글

DailyPin - 출시 프로젝트 회고  (0) 2023.11.04
23.11.03 금  (2) 2023.11.04
23.11.01 수  (1) 2023.11.01
23.10.31 화  (1) 2023.11.01
23.09.01 금  (0) 2023.09.01
'Study/🌱 SeSAC' 카테고리의 다른 글
  • DailyPin - 출시 프로젝트 회고
  • 23.11.03 금
  • 23.11.01 수
  • 23.10.31 화
김졀니
김졀니
🍎 iOS 개발
  • 김졀니
    졀니의 개발 공부✨
    김졀니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • iOS
        • Swift
        • UIKit&SwiftUI
        • RxSwift&Combine
        • WWDC
      • Study
        • 🚨 TroubleShooting
        • 🌱 SeSAC
  • 블로그 메뉴

    • 홈
    • Github
  • 인기 글

  • 최근 글

  • 태그

    CLLocation
    concurrency
    Realm
    인앱리뷰
    mapkit
    layoutIfNeeded
    traits
    Sendable
    actor
    mainactor
    의존성 주입
    FileManager
    clipstobounds
    pointfree
    swiftdata
    ios
    위치 권한
    이미지 캐싱
    wwdc23
    OperationQueue
    Swift
    displayPriority
    observable
    ReactorKit
    swift concurrency
    RxSwift
    kingfisher header
    동시성프로그래밍
    Drawing Cycle
    @PropertyWrapper
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
김졀니
23.11.02 목
상단으로

티스토리툴바