rxSwift

[rxSwift] Dispose 는 왜 하는 걸까?

웰코발 2022. 10. 20. 20:12

dispose

  • 구독(Subscribe)을 처리, 메모리 누수를 막기 위함.
  • 모든 subscribe의 return 에는 Disposable를 방출함.
  • 사용하지 않는 Observable을 메모리에서 해제하기 위함.
  • Disposable 프로토콜 안에는 disposed func으로 사용하지 않는 Observable을 DisposeBag에 넣어 관리 할 수 있음.

disposeBag

  • 구독에 대해서 일일히 관리하는 것은 효율적이지 못하기 때문에, RxSwift에서 제공하는 disposedBag 타입을 이용
  • disposeBag에는 disposables를 가지고 있음, disposable은 dispose bag이 할당 해제 하려고 할 때마다 dispose()를 호출
Observable.of(1, 2, 3)
    .subscribe {
        print($0)
    }
    .dispose()
  • 위와 같이 Observable 하나하나 dispose 시켜주는게 번거롭기에 아래와 같이 DisposeBag에 넣어 관리함. 즉, 쓰레기통과 같은 원리이다.
let disposeBag = DisposeBag()

Observable.of(1, 2, 3) 
    .subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
    
Observable.of(4, 5, 6) 
    .subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
    
Observable.of(7, 8, 9) 
    .subscribe(onNext: {
    	print($0)
    })
    .disposed(by: disposeBag)
    

// deinit 시 disposeBag에 담긴 Observable의 메모리 해제가 이르어짐
  • 해당 Observable을 가지고 있는 클래스가 해제 될 때 DisposeBag에 담긴 Observable도 같이 해제함.