Disposable
Observer는 Observable을 Subscribe하여 Observable이 emit하는 Item을 받을 수 있다.
만약 더이상 Observable에 대한 item을 받지 않기위해 Subscribe를 해제하려면 어떻게 해야할까?
➡️ Disposable을 사용

subscribe 정의를 보면 return 타입이 Disposable임을 알 수 있다.
즉, 더이상 subscribe를 유지하지 않고싶다면 Disposable을 return하여 subscribe를 취소하라는 것.

Disposable은 dispose라는 메소드를 가진 Protocol로 정의되어 있다.
➡️ Observer는 Observable을 Subscribe 메소드를 통해 구독하고있으며, 이벤트를 전달 받는다.
더이상 이벤트를 전달 받고 싶지 않으면 Disposable을 return하여 Subscribe를 취소한다.
Disposable은 dispose 메소드를 가지고 있는 Protocol이다.

위의 buttonTappedRx 메소드는 버튼을 클릭 시 1초마다 숫자를 방출하고 print하는 메소드이다.

버튼을 클릭하면 buttonTappedRx 메소드가 실행되고, 1초 간격으로 emit된 숫자가 print 된다.
취소버튼을 클릭하면 disposeButtonTappedRx 메소드가 실행되고, Subsribe가 해제되어 더이상 이벤트가 작동되지 않는다.
✅ dispose 메모리를 실행하는 건, 내가 원하는 시점에 해당 이벤트의 Subscribe를 취소하기 위함인 것도 있지만, 가장 중요한 이유 중 하나는 메모리 관리 때문이다.
Observable은 onCompleted, onError 발생 전까지 계속 emit한다.
따라서 더이상 emit하면 안되는 시점에서 deinit 해줘야 한다.

여기 init시에 1초마다 숫자를 방출하는 Observable이 있고 해당 Observable을 구독하여 방출한 숫자를 print하게 만들었다.
return 값인 Disposable 타입의 인스턴스로 어떠한 처리도 하지 않았다.

SecondViewController가 Present 되었을 때, 1초마다 숫자가 Print되는 건 당연하다.
하지만, 해당 이벤트를 실행하던 SecondViewController가 앱에서 사라졌음에도 불구하고,
해당 Observer에 대한 리소스가 해제되지 않아 계속 이벤트를 방출하여 숫자가 계속 Print되고 있음을 보여준다.

위의 코드처럼 dispose처리를 해준다면

SecondViewController가 deinit될 때, dispose되어 더이상 Print되지 않는다.
DisposeBag
✅ DisposeBag = Disposable을 담는 Bag(가방)
var button1Disposable: Disposable?
var button2Disposable: Disposable?
var button3Disposable: Disposable?
위의 코드처럼 Dispose해줘야 하는 Disposable이 많아진다면 번거롭고 지저분하다.
var disposeBag: DisposeBag = DisposeBag()
disposeBag을 전역변수로 만들어서 관리하면 편리하다.
그럼 어떻게 가방에 담을 수 있을까?

disposed() 메소드를 이용하면 된다.

위의 코드처럼 subscribe를 통해 return 된 Disposable 객체에 disposed(by bag:) 메소드로 disposeBag 객체를 넘겨주면 disposeBage 안에 해당 Disposable이 insert 된다.
✅ deinit될 때 disposeBag안에 있는 Disposable 객체들을 모두 dispose() 시켜야할까?
아니요! DisposeBag 객체 자체가 deinit되는 순간 내부에 있는 dispose() 메소드를 호출 ➡️ dispose() 메소드에서 Disposables란 Disposable 배열에 담긴 disposable을 순회하면서 모두 dispose() 메소드를 호출


위의 코드 처럼 deinit 부분을 주석으로 처리하고 실행시켜도 더이상 Print되지 않는다.
onDisposed

Subscribe의 onDisposed 메소드는 disposed() 메소드가 불릴 때 실행 될 클로저를 넘겨주는 것

를 실행하면

취소버튼으로 Dispose시켰을 때 onDiseposed !!!!! 가 출력된다.
Reference
https://babbab2.tistory.com/186
https://www.youtube.com/watch?v=TFd6JJAQXOc&list=PL03rJBlpwTaAh5zfc8KWALc3ADgugJwjq&index=4
'iOS > RxSwift' 카테고리의 다른 글
[iOS/RxSwift] Operators - Map, Filter (0) | 2024.02.03 |
---|---|
[iOS/RxSwift] Operators - 생성 연산자 (create, just, of, from) (1) | 2024.02.03 |
[iOS/RxSwift] Marble Diagram (0) | 2024.02.01 |
[iOS/RxSwift] Observable, Observer (0) | 2024.01.30 |
[iOS/RxSwift] RxSwift가 뭔데? (0) | 2024.01.30 |
Disposable
Observer는 Observable을 Subscribe하여 Observable이 emit하는 Item을 받을 수 있다.
만약 더이상 Observable에 대한 item을 받지 않기위해 Subscribe를 해제하려면 어떻게 해야할까?
➡️ Disposable을 사용

subscribe 정의를 보면 return 타입이 Disposable임을 알 수 있다.
즉, 더이상 subscribe를 유지하지 않고싶다면 Disposable을 return하여 subscribe를 취소하라는 것.

Disposable은 dispose라는 메소드를 가진 Protocol로 정의되어 있다.
➡️ Observer는 Observable을 Subscribe 메소드를 통해 구독하고있으며, 이벤트를 전달 받는다.
더이상 이벤트를 전달 받고 싶지 않으면 Disposable을 return하여 Subscribe를 취소한다.
Disposable은 dispose 메소드를 가지고 있는 Protocol이다.

위의 buttonTappedRx 메소드는 버튼을 클릭 시 1초마다 숫자를 방출하고 print하는 메소드이다.

버튼을 클릭하면 buttonTappedRx 메소드가 실행되고, 1초 간격으로 emit된 숫자가 print 된다.
취소버튼을 클릭하면 disposeButtonTappedRx 메소드가 실행되고, Subsribe가 해제되어 더이상 이벤트가 작동되지 않는다.
✅ dispose 메모리를 실행하는 건, 내가 원하는 시점에 해당 이벤트의 Subscribe를 취소하기 위함인 것도 있지만, 가장 중요한 이유 중 하나는 메모리 관리 때문이다.
Observable은 onCompleted, onError 발생 전까지 계속 emit한다.
따라서 더이상 emit하면 안되는 시점에서 deinit 해줘야 한다.

여기 init시에 1초마다 숫자를 방출하는 Observable이 있고 해당 Observable을 구독하여 방출한 숫자를 print하게 만들었다.
return 값인 Disposable 타입의 인스턴스로 어떠한 처리도 하지 않았다.

SecondViewController가 Present 되었을 때, 1초마다 숫자가 Print되는 건 당연하다.
하지만, 해당 이벤트를 실행하던 SecondViewController가 앱에서 사라졌음에도 불구하고,
해당 Observer에 대한 리소스가 해제되지 않아 계속 이벤트를 방출하여 숫자가 계속 Print되고 있음을 보여준다.

위의 코드처럼 dispose처리를 해준다면

SecondViewController가 deinit될 때, dispose되어 더이상 Print되지 않는다.
DisposeBag
✅ DisposeBag = Disposable을 담는 Bag(가방)
var button1Disposable: Disposable?
var button2Disposable: Disposable?
var button3Disposable: Disposable?
위의 코드처럼 Dispose해줘야 하는 Disposable이 많아진다면 번거롭고 지저분하다.
var disposeBag: DisposeBag = DisposeBag()
disposeBag을 전역변수로 만들어서 관리하면 편리하다.
그럼 어떻게 가방에 담을 수 있을까?

disposed() 메소드를 이용하면 된다.

위의 코드처럼 subscribe를 통해 return 된 Disposable 객체에 disposed(by bag:) 메소드로 disposeBag 객체를 넘겨주면 disposeBage 안에 해당 Disposable이 insert 된다.
✅ deinit될 때 disposeBag안에 있는 Disposable 객체들을 모두 dispose() 시켜야할까?
아니요! DisposeBag 객체 자체가 deinit되는 순간 내부에 있는 dispose() 메소드를 호출 ➡️ dispose() 메소드에서 Disposables란 Disposable 배열에 담긴 disposable을 순회하면서 모두 dispose() 메소드를 호출


위의 코드 처럼 deinit 부분을 주석으로 처리하고 실행시켜도 더이상 Print되지 않는다.
onDisposed

Subscribe의 onDisposed 메소드는 disposed() 메소드가 불릴 때 실행 될 클로저를 넘겨주는 것

를 실행하면

취소버튼으로 Dispose시켰을 때 onDiseposed !!!!! 가 출력된다.
Reference
https://babbab2.tistory.com/186
https://www.youtube.com/watch?v=TFd6JJAQXOc&list=PL03rJBlpwTaAh5zfc8KWALc3ADgugJwjq&index=4
'iOS > RxSwift' 카테고리의 다른 글
[iOS/RxSwift] Operators - Map, Filter (0) | 2024.02.03 |
---|---|
[iOS/RxSwift] Operators - 생성 연산자 (create, just, of, from) (1) | 2024.02.03 |
[iOS/RxSwift] Marble Diagram (0) | 2024.02.01 |
[iOS/RxSwift] Observable, Observer (0) | 2024.01.30 |
[iOS/RxSwift] RxSwift가 뭔데? (0) | 2024.01.30 |