[RxSwift] Dispose, DisposeBag

·2024년 4월 6일

RxSwift

목록 보기
3/4

Dispose, DisposeBag

Observable은 기본적으로, complete이나 error가 발생하기 전까진 계속 이벤트를 방출 시킨다.
따라서, 이벤트가 더이상 방출되면 안 되는 시점에서 리소스를 직접 deinit 해줘야 한다.

만약 deinit 해주는 과정을 하지 않으면, 리소스는 계속해서 필요할 때마다 이벤트를 방출시키는 메모리 leak으로 이어진다.

여기서 deinit은 dispose를 이용한다.

근데, 앞으로 보통은 DisposeBag을 이용해서 deinit을 해줄 예정이다. DisposeBag은 dispose를 여러개 담는 메소드이다. 자신이 deinit될 때 갖고 있던 disposable을 모두 dispose 시키기 때문에 따로 deinit 구문을 적어주지 않아도 된다.

참고로 ControlEvent의 경우, 해당 이벤트를 갖고 있는 인스턴스가 deinit 될 때 자동으로 dispose 된다. 예를 들어 다음과 같은 케이스에서는 disposable에 대해 따로 처리해주지 않아도 된다.

import UIKit
import RxSwift
import RxCocoa
 
class SodeulViewController: UIViewController {
    @IBOutlet weak var sodeulButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        sodeulButton.rx.tap
            .subscribe(onNext: {
                print("소들 버튼 눌림")
            }, onDisposed: {
                print("소들 버튼 disposed")
            })
    }
}
 

그렇지만 명시적으로 disposeBag 처리를 해주는 게 좋다고 들었다.

헷갈릴 수 있는 부분은, dispose는 해당 Observable에 대한 구독을 해제하고, 관련된 리소스를 정리하는 작업이기 때문에 이미 바인딩 혹은 구독된 속성을 초기화하지 않는다.

Observable의 LifeCycle

  1. Observable 생성
  2. Subscribe가 되면 Observable이 실행
  3. next를 통해 item을 emit
    • 도중에 오류가 발생하면 error, 정상적으로 모든 이벤트가 완료 되면 completed를 notification하고 시퀀스 종료
    • 시퀀스가 종료되는 시점에 dispose
    • 시퀀스는 종료하면 더 이상 이벤트 발생 X -> observable 재사용 불가


참고:
SeSAC 메모리스
https://babbab2.tistory.com

0개의 댓글