티스토리 뷰

iOS

[Rx] DisposeBag

Sueaty 2021. 5. 17. 10:40
Syntax Highlighting으로 편하게 읽고 싶으신 분들은 여기서 읽으시면 되어유~ [노션 바로가기]

 

donaricano-btn

viewModel.imageList
	.subscribe(onNext: {[weak self] images in 
			self?.imageList.accept(images)
	})
	.disposed(by: disposeBag)

guard let self = self else { return } 만큼이나 관성의 법칙에 의해 쓰게 되는 .disposed(by: disposeBag). 제대로 알고 쓰는건가 라는 의심이 들어 알아보고 싶어졌다.

무조건 subscription을 cancel 하는 것은 아니다

위에 예시 처럼 subscription을 만들었다고 항상 dispose 시켜야 하는 것은 아니다.
예를 들어 subscribe를 하게 되면 서버에 request를 보내고 response를 기다리게 된다고 해보자.
subscription은 만들었는데 HOXY 뒤로가기(navigation이라고 치자) 하게 되면?

 

화면을 뒤로가면 subscription을 생성한 현재 화면은 navigation stack에서 pop 되면서 deallocate 된다.
그러면 우리의... subscription은?

모긴 모야 이제 서버에서 response와도 못 받는거지

 

그래서 중요한 것은 개발자가 언제 Observable를 언제 terminate 시킬 것인지 정할 수 있어야 한다는 것이다.

모든 것의 시작 : Disposable

// Disposable
public protocol Disposable {
		func dispose()
}

Observable을 구독하면 Disposable과 Observable 사이에 retain cycle이 형성된다.
Observable이 Disposable에 강한 참조를 갖고 있어서 Observable이 dispose를 해줘야 이 관계가 끊긴다.
(물론 completed 또는 error로 알아서 종료가 되면 자연스럽게 끊어지는 것이구)

 

completed나 error가 방출되면서 종료되지 않는다면 수동(?)으로 관계를 끊어주어야 하니,
subscription이 속해있는 class가 메모리에서 해제 될 때 일괄적으로 subscription.dispose()로 취소해주면 된다.
그런데 보통 subscription을 하나만 만들진 않아서 조금 복잡해진다.
각각 dispose 하기 번거로우니까 [Disposable]로 만들어서 아래와 같이 대체할 수 있다.

var subscriptions = [Disposable]()

deinit {
	subscriptions.forEach{ $0.dispose() }
}

결국 이 생김새가 DisposeBag다. 각 subscription 끝에 .disposed(by: ) 를 통해 DisposeBag에 Disposable들을 넣어주면 DisposeBag가 메모리에서 해제되는 시점에 자신이 갖고 있던 dispoable들을 dispose 해준다.

 

만약 deinit 시점까지 기다릴 수 없고 바로 갈아치우고(?) 싶다면  self.disposeBag = DisposeBag(). 이렇게 하면 기존에 갖고 있던 disposable들을 다 dispose하고 새로 갖게 된다.

In case contained disposables need to be disposed,
just put a different dispose bag or create a new one in its place.
In case explicit disposal is necessary, there is also CompositeDisposable.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함