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
'🍎 iOS > RxSwift' 카테고리의 다른 글
[RxSwift, RxCocoa] 주요 Operator 특징 및 차이점 정리 (계속 업데이트 예정) (0) | 2023.03.16 |
---|---|
[RxSwift] RxSwift + MVVM + Moya 적용 (feat. tableview binding) (0) | 2023.01.19 |
[RxSwift] 곰튀김 RxSwift + MVVM 정리 (0) | 2023.01.16 |