Tunko Development Diary

RxSwift) Disposables 란? 본문

Development/RxSwift

RxSwift) Disposables 란?

Tunko 2022. 5. 30. 12:09

요약

  • Disposable 의 기능은 리소스 해제, 실행취소
  • Subscription Disposable 라고도 불립니다.
  • DisposeBag 사용방법

옵저버블의 실행을 취소하고 리소스를 정리하는 방법

Observable.from([1,2,3])
    .subscribe { elem in
        print("Next", elem)
    } onError: { error in
        print("Error", error)
    } onCompleted: {
        print("onCompleted")
    } onDisposed: { 
        print("Disposed")
    }
// 결과
Next 1
Next 2
Next 3
onCompleted
Disposed

Disposed는 옵저버블이 전달하는 이벤트는 아닙니다.

옵저버블과 관련된 모든 리소스가 해제된 후에 Disposed가 호출 됩니다.

옵저버블이 onCompleted 나 onError 이벤트를 통해 종료되어도 특별한 문제는 없습니다. 하지만 RxSwift공식 문서를 보면 이런 경우에도 직접적으로 리소스를 정리하라고 명시되어 있습니다.

이때 사용하는것이 Disposable 입니다.

아래 예시처럼 할 수 있습니다.

let ob = Observable.from([1,2,3])
    .subscribe {
        print($0)
    }
ob.dispose()

하지만 DisposeBag 사용을 권장합니다.

var bag = DisposeBag()
Observable.from([1,2,3])
    .subscribe {
        print($0)
    }
    .disposed(by: bag)

마지막으로 DIsposables 의 실행취소 예시입니다.

let sub2 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    .subscribe { elem in
        print("Next", elem)
    } onError: { error in
        print("Error", error)
    } onCompleted: {
        print("onCompleted")
    } onDisposed: {
        print("Disposed")
    }

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    sub2.dispose()
}
Next 0
Next 1
Next 2
Disposed

출력된 로그를 보면 onCompleted 나 onError 이벤트가 없습니다.

이유는 3초뒤에 명시적으로 sub2옵저버블에 대한 모든 리소스가 해지 되기때문이다. 그래서 이벤트도 받을 수 없다. 그렇기 때문에 이렇게 직접적으로 dispose 시키는건 가능한 피해야 합니다.

반응형

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

RxSwift) PublishSubject 란?  (0) 2022.05.30
Subject 란?  (0) 2022.05.30
RxSwift) Operators 란?  (0) 2022.05.30
RxSwift) Observables 과 Observers  (0) 2022.05.30
Reactive Programming 란?  (0) 2022.05.30
Comments