버그 잡이

RxSwift - Dispose & DisposeBag 본문

RxSwift

RxSwift - Dispose & DisposeBag

버그잡이 2020. 10. 1. 18:57

 

Observable은 subscribe 이후 complete 또는 error 이벤트가 발생하기 전까지 계속 next 이벤트를 발생시킵니다.

 

"계속" 이라는 단어는 프로그래머 입장에서 주의를 기울여야 하는 단어입니다.

 

계속 동작한다는 것은 굳이 동작하지 않아도 될 때도 동작한다는 것을 의미하고 이는 메모리 누수로 이어집니다.

 

 

오늘은 Observable을 subscribe(구독) 한 이후에 적절한 시점에 구독을 해지하는 방법에 대해서 알아보겠습니다.

 

 

1. Dispose

 

아래와 같이 observable을 구독하는 코드가 있습니다.

subscribe() 메서드는 기본적으로 disposable을 반환합니다. 

disposable은 메모리 관리를 도와주는 객체입니다. (크게 리소스 취소와 실행 취소에 사용됩니다.)

let observable = Observable.of(1, 2, 3)

let subscription = observable.subscribe { print($0) }

 

dispose()를 활용하면 원하는 시점에 구독을 해지할 수 있습니다.

subscription.dispose()

 

 

2. DisposeBag

 

dispose()는 구독하는 것 마다 별도로 관리를 해줘야하는 번거로움이 있습니다.

disposeBag을 활용하면 여러개의 구독을 한번에 해제할 수 있습니다.

subscribe가 반환하는 disposable이 disposeBag에 담기고 disposeBag이 해제될때 disposable이 모두 해제되는 것입니다.

let disposeBag = DisposeBag()
let observable = Observable.of(1, 2, 3)

let subscription = observable
		.subscribe { print($0) }
                .disposed(by: disposeBag)

 

"disposeBag 은 언제 해제될까요?"

 

 1. var bag = nil 처럼 직접 해제

 2. class가 deinit 되면서 자동 해제

 

 

 

반응형
Comments