dispose
Observable 을 생성하고, subscribe 를 했다면, 반드시 dispose 시켜주어 메모리 누수를 방지해야 한다. 이것이 하나의 Observable 생명 주기이다.
Observable 은 subscribe 받기 전까지 아무 것도 하지 않는 하나의 sequence 일 뿐이다. 이때 subscribe 는 Observable 에 정의된 event 를 방출하는 방아쇠 역할을 하는데, dispose 는 방아쇠를 당겨서 방출했던 Observable 의 subscribe 을 취소하는 역할을 한다.
다음은 dispose 를 설명하기 위한 예시이다.
Observable.of(1,2,3)
.subscribe {
print($0)
}
.dispose()
먼저 1,2,3 이라는 Int 타입 element를 갖는 Observable 을 생성하였다.
이 Observable 을 subscribe 해야지만 원하는 element 를 받을 수 있기 때문에, subscribe 를 통해 event 가 방출되도록 하였다
즉, Observable의 subscribe 는 Disposable 를 반환한다.
또한, 출력된 각각의 이벤트를 print 를 통해 console에 찍히도록 하였다
subscribe 를 취소하고 싶을 때 dispose 를 사용하는데, dispose 한 뒤에는 event 가 방출되지 않는다
현재는 1, 2, 3 밖에 안되지만, 만약 이 요소가 3개가 아닌 무한한 요소로 반복되는 어떤 sequence 라면 반드시 dispose 를 호출하여 complete 를 시켜야 한다.
disposeBag
각각의 subscribe 에 대해 일일이 하나씩 dispose 로 관리하는 것은 효율적이지 않고, 리스크도 있다. 그러므로 disposeBag 타입을 제공한다.
말 그대로 Disposable 타입을 담을 수 있는 클래스이다. DisposeBag 에 담긴 Disposable 들은 DisposeBag 이 deallocate 될 때, 같이 deallocate 된다.
다음은 disposeBag 을 사용한 예시 코드이다.
print("-------disposeBag------")
let disposeBag = DisposeBag()
Observable.of(1,2,3)
.subscribe {
print($0)
}
.disposed(by: disposeBag)
-------disposeBag------
next(1)
next(2)
next(3)
completed
먼저 DisposeBag 을 만들고, Observable 하나 선언한 다음, subscribe 의 onNext 이벤트를 통해 element 를 print 하고 있다.
그리고 subscribe 를 통해 방출되는 return 값을 disposeBag 에 추가하고 있다.
Observable 에 대해 subscribe 를 하고 있을 때 이것을 즉시 disposeBag 에 추가하는 것이다. disposeBag 은 이를 잘 가지고 있다가 자신이 할당 해제할 때, Disposable 또한 할당 해제한다.
그런데 subscribe 할 때마다 disposeBag 에 넣는 방식 꽤 번거롭다. 굳이 왜 이렇게 할까?
만약 disposeBag 을 subscription 에 추가하거나 수동적으로 dispose 를 호출하는 것을 빼먹는다면, Observable 이 끝나지 않기 땜누에 메모리 누수가 일어날 것이다.
' iOS > RxSwift' 카테고리의 다른 글
RxSwift - Subject (0) | 2022.11.01 |
---|---|
RxSwift - Traits (Single, Maybe, Completable) (0) | 2022.10.31 |
RxSwift - Observable 과 subscribe (0) | 2022.10.24 |
RxSwift - Observable 생성 시 사용하는 연산자 정리 (0) | 2022.10.24 |
RxSwift - 기본 구성 요소 (0) | 2022.10.22 |