https://github.com/RxSwiftCommunity/NSObject-Rx
RxSwiftCommunity/NSObject-Rx
Handy RxSwift extensions on NSObject, including rx.disposeBag. - RxSwiftCommunity/NSObject-Rx
github.com
예제코드는 아래 깃헙에 있습니다:)
https://github.com/Developer-Paul-t/RxSwift
Developer-Paul-t/RxSwift
Contribute to Developer-Paul-t/RxSwift development by creating an account on GitHub.
github.com
오늘은 리소스 정리를 위해서 사용되는 API을 좀 덜 피곤하게 사용하기 위한 라이브러리를 알아보자. RxSwift에서 리소스를 정리하기 위해서 disposeBag을 사용한다. 원리는 간단한데 아래처럼 disposeBag이 클래스의 멤버 변수로 선언되어져 있으면, 해당 클래스가 사라질 때 멤버 변수도 사라진다. 그렇기 때문에 자연스럽게 관련된 리소스(Bag에 담긴 리소스)가 함께 해제되는 것이다. (클로저 안에 있는 self로 인해 리소스가 해제가 되지 않은 경우도 생긴다...) 아무튼 RxSwift에서는 dispose() 메소드를 직접 호출하는 것보다 Bag에 넣어서 관리하기를 추천한다. 이러다보니 매 클래스마다 disposeBag 객체를 생성해야 하는데, 귀찮다면 귀찮은 일이다. 이를 위해서 NSObject+Rx라는 라이브러리를 사용한다.
이 라이브러리를 사용하면 NSObject를 상속한 모든 클래스에 disposeBag을 자동으로 추가된다. UIViewController는 NSObject를 상속하고 있다. 그래서 아래처럼 disposeBag을 주석처리해도 rx 네임스페이스를 통해 바로 disposeBag에 접근 할 수 있다.
커스텀 클래스의 경우에는 NSObject를 상속받지 않는다. 그렇기 때문에 NSObject+Rx를 import해도 해당 기능을 사용할 수 없다.
이 경우에는 HasDisposeBag이라는 특별한 프로토콜을 채용한다.
이 프로토콜을 채용하면 rx 네임스페이스에 접근하지 않고 바로 disposeBag으로 접근해서 사용할 수 있다. 이 프로토콜은 class 프로토콜로 선언되어 있다. 그래서 struct에서 채용하는 것은 불가능하다. 그래서 구조체에서는 직접 disposeBag을 추가해야 한다.
생각보다 귀찮은 작업을 줄여주는 라이브러리다. 꼭 사용해보시길!
'RxSwift' 카테고리의 다른 글
[RxSwift Community] RxFlow 사용하기 1 (0) | 2021.06.17 |
---|---|
[RxSwift Community] RxFlow 사용하기 전에... (0) | 2021.06.11 |
[RxSwift Community] RxDataSources Animatable편 (0) | 2021.06.04 |
[RxSwift Community] RxDataSource Basic편 (0) | 2021.06.01 |
[RxSwift Community] Action 사용하기 (0) | 2021.06.01 |
댓글