본문 바로가기

Swift 공부

RxSwift Disposable 이란?

지난번 면접에서 RxSwift에 관한 면접 질문을 받던중 Disposable 이란 질문을 받게되었고 
항상 사용했지만 답변으로 드리기에 어떤식으로 답변을 드려야하나 생각을 고민해봤고 머리속에서
Observable과 관련된 구독의 메모리 할당을 해제해주는 거구나 라는걸로 알고있는데 

평소 답변을 생각을 안해봤고 내가 알고있는 지식이 맞나? 라는 확신이 들지 않으니 자신감있게 말할 자신이 없었고

그래서 답변을 아예 못드리겠다라고 답변을 드렸던것같다. 그러면서 나오는 추가질문인 Disposebag은 언제 메모리 할당을 해제하냐 라는 질문은 deinit되는 시점에 메모리 할당이 해제된다고 말씀드렸는데 이게 맞나 아닌가 싶어서 제대로 공부를 해볼려고한다.

 

 

우선 Observable을 subscribe / bind (구독) 를 진행해 알맞은 이벤트 처리를 하게되면

 

subscribe 같은 경우 next , error , completed  

Subscribe 메서드를 통해 옵저버와 Observable을 연결한다. 여러분의 옵저버는 아래의 메서드를 구현하게 될 것이다:

onNext Observable은 새로운 항목들을 배출할 때마다 이 메서드를 호출한다. 이 메서드는 Observable이 배출하는 항목을 파라미터로 전달 받는다.

onError Observable은 기대하는 데이터가 생성되지 않았거나 다른 이유로 오류가 발생할 경우 오류를 알리기 위해 이 메서드를 호출한다. 이 메서드가 호출되면 onNext나 onCompleted는 더 이상 호출되지 않는다. onError 메서드는 오류 정보를 저장하고 있는 객체를 파라미터로 전달 받는다.

onCompleted 오류가 발생하지 않았다면 Observable은 마지막 onNext를 호출한 후 이 메서드를 호출한다.

-공식문서 참고-

bind 같은 경우 next 이벤트를 방출하게된다.

 

let some = SomeObservable
.subscribe { int in
    print("Next", int)
} onError: { error in
    print("Error", error)
} onCompleted: {
    print("Completed")
} onDisposed: {
    print("Disposable")
}

 

위의 이벤트들이 끝나게 되면 Disposable 이란것을 호출 후 작업이 완료가 된다.

Disposable이 뭐냐? 우리가 결국 특정 객체를 구독을 하고 있다는것은 메모리를 사용하고 있다는 뜻인데

구독이 필요없거나 끝난 시점에는 메모리를 해제를 해줘야한다. 그걸 도와주는게 Disposable 이라고 한다.

만약 구독중인 이벤트가 onError , onColpleted 로 끝나게된다면 해당 구독은 자동으로 메모리에서 해제가 되지만(가이드 문서에서는 컨트롤 해줘야 한다고 적혀있다.)

정상적으로 이벤트들이 진행되었을경우 직접적으로 메모리에서 할당을 해제 Disposable을 통해 진행한다.

그래서 Disposable의 지금 생각하는 Disposable이란? 에 대한

내 답변은  "구독중인 객체의 메모리 할당을 해제하며 이벤트 구독을 중지하는 역활"

 

public protocol Disposable {
    func dispose()
}

public protocol Cancelable : Disposable {
    var isDisposed: Bool { get }
}

 

그리고 Disposebag의 메모리 할당 시점에대해 답변을 deinit 이라고 했었는데

지금 생각했을때 정확한 답변은 이벤트가 모두 끝났을때 와 이벤트가 진행하던중 deinit 되엇을때 라고 답변하는게 좀 더 맞는답변이지 않을까 생각이든다

 

Disposebag 공부자료

 

http://adamborek.com/memory-managment-rxswift/

 

Memory management in RxSwift - DisposeBag - Code in a suit

A blog post about memory management in RxSwift. If you want to avoid retain cycle and memory leaks it's the article for you. It's all about DisposeBag

adamborek.com

https://velog.io/@dlskawns96/RxSwift-Closure%EC%97%90%EC%84%9C-Memory-Leak-%ED%94%BC%ED%95%98%EA%B8%B0

 

[RxSwift] Closure에서 Memory Leak 피하기

RxSwift에서 발생할 수 있는 메모리 누수와 해결 방법에 대해 정리해봤습니다.

velog.io

https://magi82.github.io/ios-rxswift-03/

 

RxSwift 알아보기(subscribe, dispose에 대해서) - 03 – 마기의 개발 블로그 – 즐겁게 개발을 하고 싶은

안녕하세요. 당근마켓에서 iOS 앱을 개발중인 마기입니다. 자주 포스팅 하겠다던 각오는 이직하게 되면서 새로운 환경에서 적응 한다고.. 정신이 없어서 이제서야 올리게 되었네요 😭 좋은 동료

magi82.github.io