티스토리 뷰

iOS/RxSwift

RxSwift - Disposable, DisposeBag

포도 동 2022. 3. 1. 15:58

Rx에서 구독중인 시퀀스가 Error나 Completed 이벤트를 방출하지 않으면 계속 Next 이벤트를 수행하게 됩니다. Next 이벤트를 수행하기 위한 자원이 계속 할당되어 있다면 이는 메모리 누수를 발생시키게 됩니다.

그래서 원하는 시점에 시퀀스의 실행을 취소하고 할당된 모든 리소스를 해제하고 종료 시키는 Disposing 이 필요합니다.

Disposing은 Dispose, DisposeBag을 통해 수행할 수 있습니다.

 

Dispose

Subscription에서 dispose를 호출하면 시퀀스를 종료시키고 자원을 해제할 수 있습니다.

let subscription1 = Observable.from([1, 2, 3])
    .subscribe(onNext: { elem in
        print("Next", elem)
    })

// 리소스 해제
subscription1.dispose()

위 처럼 구독중인 Observable에 대해 dispose() 메소드를 실행하면 그 즉시 시퀀스에 할당된 모든 자원을 해제시키고 종료 시킬 수 있습니다.

 

DisposeBag

disposeBag은 이름 그대로 disposable들을 담을 수 있는 가방입니다. disposeBag을 이용하면 disposable 들을 담고 있다가 필요한 시점 (뷰가 종료되는 시점)에 담겨있는 시퀀스들을 종료시킬 수 있습니다.

// disposeBag 선언
var bag = DisposeBag()

Observable.from([1, 2, 3])
    .subscribe {
        print($0)
    }
    .disposed(by: bag)
    // disposeBag 전달

DisposeBag은 위 처럼 선언하고, Observable의 disposed에 파라미터로 할당할 수 있습니다.

DisposeBag에는 여러 disposable들을 추가할 수 있고 DisposeBag이 해지되는 시점에 함께 해지됩니다.

bag = nil
// optional로 선언한 DisposeBag 변수에 nil을 할당

bag = DisposeBag()
// 빈 DisposeBag을 새로 할당

그리고 disposeBag이 해지되기 전에 직접 disposable 들을 해지하고 싶다면 위처럼 nil 또는 새 DisposeBag을 할당하면 됩니다.

 

참고: https://github.com/ReactiveX/RxSwift/blob/main/Documentation/GettingStarted.md#disposing

'iOS > RxSwift' 카테고리의 다른 글

RxSwift - Relay  (0) 2022.03.05
RxSwift - Subject  (0) 2022.03.04
RxSwift - Infallible  (0) 2022.02.28
RxSwift - Observables, Observers  (0) 2022.02.27
RxSwift 시작하기  (0) 2022.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함