본문 바로가기
iOS/RxSwift

[RxSwift] Disposable

by 최지철 2023. 9. 14.
728x90
반응형

var disposebag = DisposeBag()

Disposable

  • 리소스를 해체하고, 이벤트 구독을 중지하는것
  • 리소스 낭비방지와 불필요한 이벤트 수신을 하지 않기 위해서 사용
        Observable.from([1,2,3]).subscribe(onNext: {
            elem in
            print("Next",elem)
        },onError: {error in
            print("에러:",error)
        }, onCompleted: {
            print("Completed")
        }, onDisposed: {
            print("Disposed")
        }
        )
        //--------------
        Observable.from([1,2,3]).subscribe{
            print($0)
        }

두번째는 왜 리소스 해체가 되지 않은걸까?  그 이유는 onDisposed는 Observable의 이벤트가 아니기 때문이다.
첫 번째 코드에서 Disposed가 출력된 것은 단지 저 이벤트를 전달받도록 설정해놓았기 때문이다

 

Disposables는 각종 Disposable을 반환하는 create메소드를 가진 구조체다. 이 create를 통해 NoDisposable, AnoymousDisposable, BinaryDisposable, CompositeDisposable 등을 구성할 수 있고 각 Disposable은 다른 역할을 수행한다.

 

Disposebag

DisposeBag을 사용하는 방법인데, 공식문서에서도 dispose()를 직접 호출하는 것보다 DisposeBag을 사용하라고 되어있다. DisposeBag을 만들어서 여기에 Disposable을 담았다가 한 번에 해제하라는 뜻이다. DisposeBag을 만드는 방법은 간단하다.

var bag = DisposeBag()

Dispasable을 담을 때는 disposed(by:) 메소드를 사용하고, by에 파라미터로 Dispose Bag을 전달하면, subscribe가 리턴하는 Disposable이 DisposeBag에 추가된다. 이곳에 추가된 Disposable은 DisposeBag이 해지되는 시점에 함께 해지된다.

var bag = DisposeBag()
Observable.from([1,2,3]).subscribe{
	print($0)
}.disposed(by: bag)

ARC에서의 오토릴리즈 풀과 비슷하다.

 

그럼 DisposeBag은 언제 해제되나? 당연히 위의 변수가 해제되는 시점에 해제된다. 하지만 그 전에, 또는 내가 원하는 시점에 해제를 하고 싶다면 어떻게 할까? DisposeBag에 다시 dispose? 하지만 DisposeBag에는 dispose() 메소드를 제공하지 않는다. 다만, 새로운 DisposeBag을 만들면 이전에 있던 DisposeBag이 해제된다.

 

728x90
반응형

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

[RxSwift] Create Operators [1]  (0) 2023.10.29
[RxSwift] Relay  (1) 2023.10.29
[RxSwift] Subject  (0) 2023.10.29
[RxSwift] Observable  (0) 2023.09.14
[RxSwift] ReactiveX, RxSwift 왜 써야할까?  (0) 2023.08.30