어제는 Observable을 생성하고 구독하는 방법에 대해 정리했으니깐 이번엔 구독을 취소하는 방법에 대해 정리해보려고 합니다.
dispose()
를 호출함으로써 Observable 구독을 취소할 수 있으며 취소를 하게 되면 이벤트 방출이 더 이상 발생하지 않는다.let observable = Observable.of(1,2,3)
let subscription = observable.subscribe({ (value) in
print(value)
})
subscription.dispose()
// next(1)
// next(2)
// next(3)
// completed
위의 코드에서는 요소가 (1,2,3)밖에 없어서 completed 이벤트가 방출되었지만 요소가 무한하게 많아진다면 dispose()
를 호출해야지만 completed 이벤트가 방출된다.
dispose()
를 해줘야하는 문제점이 발생한다. 그래서 DisposedBag
타입을 사용해서 관리하면 보다 효율적으로 관리할 수 있게 된다. 마치 가방처럼 Observable을 DisposedBag에 넣어준다고 이해했다.let observable = Observable.of(1,2,3)
let disposeBag = DisposeBag()
let subscription = observable.subscribe({ (value) in
print(value)
})
.disposed(by: disposeBag)
1번 예제에서 DisposeBag() 방법을 사용한 예제다.
.crete
연산자로도 만들 수 있다. Observable이 completed
이벤트를 방출하면 disposable을 리턴하면서 구독을 취소하게 된다.let disposeBag = DisposeBag()
Observable<Int>.create({ (observable) -> Disposable in
observable.onNext(1)
observable.onNext(2)
observable.onNext(3)
//observable.onCompleted()
return Disposables.create()
}).subscribe(onNext: { print($0) }, onError: { print($0) }, onCompleted: { print("completed") }, onDisposed: { print("disposed") }
).disposed(by: disposeBag)
위의 예제에서 completed
이벤트를 방출하는 onCompleted()
부분을 주석처리하고 실행시키게 되면 다음과 같은 결과가 발생한다.
그리고 주석을 없애고 실행을 시키면 제대로 completed 이벤트가 방출이 되고 disposabled이 리턴이 되면서 구독도 취소하게 된다.
여기서 꼭 completed 이벤트가 아니더라고 Observable이 완전 종료되는 error 이벤트 경우에도 에러가 발생하면 disposable이 리턴된다.