[RxSwift] Observable(2)

나는 사과·2021년 4월 26일
0

RxSwift

목록 보기
4/8

어제는 Observable을 생성하고 구독하는 방법에 대해 정리했으니깐 이번엔 구독을 취소하는 방법에 대해 정리해보려고 합니다.

Observable 종료

  1. .dispose()
    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 이벤트가 방출된다.

  1. DisposeBag()
    1번과 같은 방식으로 구독을 취소하게 되면 Observable의 수에 따라 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() 방법을 사용한 예제다.

  1. .create(:)
    Observable을 .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이 리턴된다.

0개의 댓글