dispose() 호출 또는 disposeBag에 담는 것을 깜빡하거나, Observable이 어디에선가 의도치 않게 종료된다면 메모리leak이 발생할 수 있습니다.
Observable
은 subscribe
하기 전까지 이벤트를 발생시키지 않습니다.
Subscription
이 있어야 비로소 Observable
은 이벤트를 발생시키고 complete
또는 error
이벤트가 발생하기 전까지 계속해서 next
이벤트를 발생시킵니다.
let subscription1 = Observable.from([1, 2, 3])
.subscribe(onNext: { elem in
print("Next", elem)
}, onError: { error in
print("Error", error)
}, onCompleted: {
print("Completed")
}, onDisposed: {
print("Disposed")
})
subscription1.dispose()
subscription이 중단되면, Observable은 더 이상 이벤트를 발생시키지 않습니다.
생성하는 Subscription마다 각각 dipose를 관리하는 것은 리스크가 있고 추천되지 않습니다.
따라서 DiposeBag을 지원합니다.
DisposeBag을 통해 여러 Disposable을 담아 DisposeBag이 해제될 때 같이 deallocate됩니다.
var bag = DisposeBag()
Observable.from([1, 2, 3])
.subscribe {
print($0)
}
.disposed(by: bag)
bag = DisposeBag() // 기존 DisposeBag이 바뀌었기 때문에 위의 Observable이 해제됨
Observable.from(["a", "b", "c"])
.subscribe(onNext: {elem in
print(elem)
}, onError: { error in
print("Error", error)
}, onCompleted: {
print("Completed")
}, onDisposed: {
print("Disposed")
})
// a
// b
// c
// Completed
// Disposed
onDisposed는 Observable의 resource가 해제된 다음에 발생합니다.
-> error 또는 completed가 발생하여 resource가 정리되면 onDisposed가 발생합니다.
계속해서 이벤트를 방출하는 Observable을 중지하기 위해서도 사용
let subscription = Observable<Int>
.interval(.seconds(1), scheduler: MainScheduler.instance)
.subscribe(onNext: { elem in
print("Next", elem)
}, onError: { error in
print("Error", error)
}, onCompleted: {
print("Completed")
}, onDisposed: {
print("Disposed")
})
DispatchQueue.main.asyncAfter(deadline: .now() + 5) { // 5초 뒤에 dispose
subscription.dispose()
}
//Next 0
//Next 1
//Next 2
//Next 3
//Next 4
//Disposed
https://rhammer.tistory.com/286?category=649741
https://www.youtube.com/watch?v=m41N4czHGF4&list=PLziSvys01Oek7ANk4rzOYobnUU_FTu5ns&index=2&ab_channel=KxCoding