🍎 iOS/RxSwift

[RxSwift] Disposable, Dispose, DisposeBag

dev_zoe 2023. 3. 16. 18:36
반응형

Disposable, Dispose

RxSwift에서, 옵저버는 subscribe를 통해 이벤트를 전달받아서 처리하게 되는데, subscribe는 이후에 Disposable 을 반환한다.

또한 Disposable에는 'Dispose resource' 할 수 있는 dispose() 메소드가 제공된다.

dispose의 원래 뜻은 '처분하다' 로, 이를 통해 유추해보면 이벤트에 대한 처리를 마치고 더이상 처리하지 않으니 구독을 해제해라! 라는 의미인 것으로 보인다.

 

정리하자면 subscribe의 반환값으로 Disposable 이 반환되고, 이벤트 처리가 끝나면 해당 구독을 유지할 필요가 없으니 구독을 해제해주는 과정이 dispose() 라고 할 수 있다.

 

dispose를 꼭 해주어야만 하는 이유는, 구독이 끝난 이벤트를 해제해주지 않으면 옵저버에 대한 리소스가 메모리에 남아있어, 메모리 leak이 발생하게 된다!

 

DisposeBag

- 의미 그대로 'disposeable'을 담아두는 'bag'이라고 할 수 있다.

한 뷰컨트롤러에서 많은 이벤트에 대해 구독하고 있다면, 해당 이벤트를 일일이 다 dispose() 해주어야만 하는 번거로움이 있다.

따라서 이벤트를 처리하고 난 다음에 반환되는 Disposable을 모아두는 배열인 disposeBag이 RxSwift에 구현되어있다!

- DisposeBag을 사용하여 dispose를 하기 위해서는, DisposeBag 객체를 생성한 다음

disposed(by: DisposeBag) 메소드를 이용하면 된다.

 

class BaseViewController: UIViewController {

	var disposeBag = DisposeBag()
    
    ... 생략
    
    button.rx.tap //RxCocoa 사용
    	.bind(to: viewModel.tapNext)
        .disposed(by: disposeBag)

 

- 그리고 해당 DisposeBag은, 객체가 deinit 될때 알아서 자기 자신 안에 들어있는 Disposable 객체들을 해지해준다.

 

 

reference

https://babbab2.tistory.com/186

반응형