RxSwift - 2.Disposables

박성민·2021년 3월 15일
0

RxSwift

목록 보기
2/4

Disposable

dispose() 호출 또는 disposeBag에 담는 것을 깜빡하거나, Observable이 어디에선가 의도치 않게 종료된다면 메모리leak이 발생할 수 있습니다.

Observablesubscribe하기 전까지 이벤트를 발생시키지 않습니다.
Subscription이 있어야 비로소 Observable은 이벤트를 발생시키고 complete 또는 error 이벤트가 발생하기 전까지 계속해서 next이벤트를 발생시킵니다.

Subscription을 중단하기 위한 Dispose

명시적 dispose()

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은 더 이상 이벤트를 발생시키지 않습니다.

DisposeBag

생성하는 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이 해제됨

onDisposed

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가 발생합니다.

실행 취소를 위한 Dispose

계속해서 이벤트를 방출하는 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

profile
iOS시작~

0개의 댓글