[RxSwift] 2. Disposing
안녕하세요, iOS 개발자 루피입니다.
오늘은 RxSwift 공식 문서를 바탕으로 Disposing에 대해 함께 알아보려고 합니다. 그럼 바로 시작해 보겠습니다! :)
시퀀스가 완료되었거나 더 이상 다가오는 요소를 처리할 필요가 없을 때, subscription에서 dispose를 호출하여 할당된 모든 리소스를 해제할 수 있습니다. 이를 통해 불필요한 리소스가 남지 않도록 관리할 수 있습니다.
예시 코드
let scheduler = SerialDispatchQueueScheduler(qos: .default)
let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
.subscribe { event in
print(event) // 0 1 2 3 4 5
}
Thread.sleep(forTimeInterval: 2.0)
subscription.dispose()
하지만
예시코드는 좋은 코드가 아니라고 합니다. 왜냐하면 우리는 귀찮게 하나 하나 수동으로 dispose를 호출하고 싶어 하지 않기 때문이죠. 귀찮잖아요 ㅎㅎ. 그래서 위 예시코드는 단순 교육적인 코드일 뿐이라고 합니다!!
우리는 subscriptions 을 dispose 하는 방법으로 더 좋은 방법들을 알 수 있는데요?? 바로 DisposeBag , takeUntil operator 또는 다른 매커니즘을 이용하는 방법입니다. 그렇다면, dispose 호출 후에 무언가를 출력할 수 있을까요? 정답은 "상황에 따라 다릅니다."
만약 스케줄러가 직렬 스케줄러이고, dispose가 같은 직렬 스케줄러에서 호출된다면, 출력은 발생하지 않습니다. 왜냐하면 dispose가 모든 처리를 바로 중단하기 때문입니다. 그렇지 않은 경우에는 출력이 가능합니다.
이는 두 개의 프로세스가 병렬로 실행되기 때문입니다. 한쪽에서는 데이터를 생성하고, 다른 쪽에서는 구독을 해제하는 일이 동시에 일어날 수 있습니다. 이 경우에는 dispose를 호출한 후에도 무언가가 출력될 수 있습니다. 두 작업이 서로 다른 스케줄러에서 별도로 실행되기 때문에 출력이 가능하죠.
병렬로 처리되는 경우: 병렬 스케줄러를 사용하면 두 가지 프로세스가 동시에 일어납니다.
- 한 프로세스는 데이터를 계속 생성하고,
- 다른 프로세스는 구독을 해제합니다.
따라서, 두 프로세스가 다른 스케줄러에서 실행되는 경우, "무언가를 출력할 수 있을까?"라는 질문 자체가 의미가 없습니다. 병렬 처리는 서로 독립적이기 때문에 한쪽이 데이터를 생성하고 있을 때, 다른 한쪽은 구독을 끝낼 수 있죠.
Dispose Bags
DisposeBag은 Rx에서 ARC와 같은 동작을 구현하는 데 사용됩니다. DisposeBag이 해제될 때, 그 안에 추가된 각 disposable에 대해 자동으로 dispose 메서드를 호출합니다. DisposeBag 자체에는 dispose 메서드가 없으며, 의도적으로 명시적으로 dispose를 호출할 수 없게 설계되었습니다. 만약 즉각적인 정리가 필요하다면, 새로운 DisposeBag을 생성하면 됩니다.
self.disposeBag = DisposeBag()
이렇게 하면 이전 참조가 정리되고, 리소스가 해제됩니다. 명시적인 수동 해제를 여전히 원한다면, CompositeDisposable을 사용하는 것이 좋습니다. 이 클래스는 원하는 동작을 제공하지만, dispose 메서드를 호출하면 새로 추가된 disposable도 즉시 해제됩니다.
Take until
자동적으로 subscription을 할당 해제하는 방법은 takeUntil operator 가 있다.
sequence
.take(until: self.rx.deallocated)
.subscribe {
print($0)
}
정리하자면, dispose는 리소스 관리를 위한 중요한 도구이지만, 수동으로 호출하는 것보다는 DisposeBag이나 takeUntil 연산자 같은 자동화된 방법을 사용하는 것이 더 깔끔하고 효율적입니다. 병렬 스케줄러에서는 구독 해제 후에도 출력이 가능할 수 있지만, 그건 스케줄러의 동작에 따라 달라지니 염두하면 좋을 거 같습니다!
이렇게 공식문서를 보고 공부한 내용을 정리해봤습니다. 피드백은 언제든지 환영입니다!!