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이 해제된다.
'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 |