[RxSwift] 2. Disposing

2024. 12. 20. 18:51·iOS/RxSwift
728x90
반응형
 

안녕하세요, iOS 개발자 루피입니다.

 

오늘은 RxSwift 공식 문서를 바탕으로 Disposing에 대해 함께 알아보려고 합니다. 그럼 바로 시작해 보겠습니다! :)


시퀀스가 완료되었거나 더 이상 다가오는 요소를 처리할 필요가 없을 때, subscription에서 dispose를 호출하여 할당된 모든 리소스를 해제할 수 있습니다. 이를 통해 불필요한 리소스가 남지 않도록 관리할 수 있습니다.

 

예시 코드 

let scheduler = SerialDispatchQueueScheduler(qos: .default)
let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
    .subscribe { event in
        print(event) // 0 1 2 3 4 5
    }

Thread.sleep(forTimeInterval: 2.0)

subscription.dispose()

 

하지만

예시코드는 좋은 코드가 아니라고 합니다. 왜냐하면 우리는 귀찮게 하나 하나 수동으로 dispose를 호출하고 싶어 하지 않기 때문이죠. 귀찮잖아요 ㅎㅎ. 그래서 위 예시코드는 단순 교육적인 코드일 뿐이라고 합니다!!

 

우리는 subscriptions 을 dispose 하는 방법으로 더 좋은 방법들을 알 수 있는데요?? 바로 DisposeBag , takeUntil operator 또는 다른 매커니즘을 이용하는 방법입니다. 그렇다면, dispose 호출 후에 무언가를 출력할 수 있을까요? 정답은 "상황에 따라 다릅니다."

 

만약 스케줄러가 직렬 스케줄러이고, dispose가 같은 직렬 스케줄러에서 호출된다면, 출력은 발생하지 않습니다. 왜냐하면 dispose가 모든 처리를 바로 중단하기 때문입니다. 그렇지 않은 경우에는 출력이 가능합니다.

 

이는 두 개의 프로세스가 병렬로 실행되기 때문입니다. 한쪽에서는 데이터를 생성하고, 다른 쪽에서는 구독을 해제하는 일이 동시에 일어날 수 있습니다. 이 경우에는 dispose를 호출한 후에도 무언가가 출력될 수 있습니다. 두 작업이 서로 다른 스케줄러에서 별도로 실행되기 때문에 출력이 가능하죠.

병렬로 처리되는 경우: 병렬 스케줄러를 사용하면 두 가지 프로세스가 동시에 일어납니다.

  • 한 프로세스는 데이터를 계속 생성하고,
  • 다른 프로세스는 구독을 해제합니다.

 

따라서, 두 프로세스가 다른 스케줄러에서 실행되는 경우, "무언가를 출력할 수 있을까?"라는 질문 자체가 의미가 없습니다. 병렬 처리는 서로 독립적이기 때문에 한쪽이 데이터를 생성하고 있을 때, 다른 한쪽은 구독을 끝낼 수 있죠.


Dispose Bags

DisposeBag은 Rx에서 ARC와 같은 동작을 구현하는 데 사용됩니다. DisposeBag이 해제될 때, 그 안에 추가된 각 disposable에 대해 자동으로 dispose 메서드를 호출합니다. DisposeBag 자체에는 dispose 메서드가 없으며, 의도적으로 명시적으로 dispose를 호출할 수 없게 설계되었습니다. 만약 즉각적인 정리가 필요하다면, 새로운 DisposeBag을 생성하면 됩니다.

  self.disposeBag = DisposeBag()

 

이렇게 하면 이전 참조가 정리되고, 리소스가 해제됩니다. 명시적인 수동 해제를 여전히 원한다면, CompositeDisposable을 사용하는 것이 좋습니다. 이 클래스는 원하는 동작을 제공하지만, dispose 메서드를 호출하면 새로 추가된 disposable도 즉시 해제됩니다.


Take until

자동적으로 subscription을 할당 해제하는 방법은 takeUntil operator 가 있다.

sequence
    .take(until: self.rx.deallocated)
    .subscribe {
        print($0)
    }

 

정리하자면, dispose는 리소스 관리를 위한 중요한 도구이지만, 수동으로 호출하는 것보다는 DisposeBag이나 takeUntil 연산자 같은 자동화된 방법을 사용하는 것이 더 깔끔하고 효율적입니다. 병렬 스케줄러에서는 구독 해제 후에도 출력이 가능할 수 있지만, 그건 스케줄러의 동작에 따라 달라지니 염두하면 좋을 거 같습니다!

 


이렇게 공식문서를 보고 공부한 내용을 정리해봤습니다. 피드백은 언제든지 환영입니다!!

728x90
반응형

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift / RxAlamofire] 네트워크 모듈 만들기  (0) 2024.12.20
[RxSwift] 3. Operators  (0) 2024.12.20
[RxSwift] 1. Observables aka Sequences  (0) 2024.12.20
[RxSwift] From / Just / Of / Repeat / Interval / Timer / Range  (0) 2024.12.20
[RxSwift] Empty / Never / Throw  (0) 2024.12.20
'iOS/RxSwift' 카테고리의 다른 글
  • [RxSwift / RxAlamofire] 네트워크 모듈 만들기
  • [RxSwift] 3. Operators
  • [RxSwift] 1. Observables aka Sequences
  • [RxSwift] From / Just / Of / Repeat / Interval / Timer / Range
kimsangjunzzang
kimsangjunzzang
루피 님의 블로그 입니다.
  • kimsangjunzzang
    루피 님의 블로그
    kimsangjunzzang
  • 전체
    오늘
    어제
    • 분류 전체보기 (97) N
      • iOS (61) N
        • Swift (32) N
        • UIKit (9)
        • SwiftUI (8)
        • RxSwift (12)
      • FE (8)
        • 모던 자바스크립트 (3)
        • HTML (5)
      • Operating System (1)
      • 트러블 슈팅 (4)
      • 바로 안 나오면 모르는거다 (4)
      • Algorithm (16)
      • 회고록 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인 패턴
    rxswift
    HTML
    알고리즘
    AppleDeveloperAcademy
    ViewController
    Algorithm
    state
    Concurrency
    ios
    task
    CS
    swift
    백준
    boj
    uikit
    web
    arc
    C++
    SwiftUI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
kimsangjunzzang
[RxSwift] 2. Disposing
상단으로

티스토리툴바