RxSwift) DisposeBag() 정복하기 1

minin·2022년 5월 12일
1

RxSwift

목록 보기
1/2
post-thumbnail

DisposeBag()

👩‍💻 새롭게 공부하며 작성한 글이기 때문에 틀린 정보가 있을 수 있습니다! 이에 대한 피드백은 언제나 환영입니다 🙌

# DisposeBag()?

  • Rx의 메모리 관리
  • 일반적으로 객체를 만들고, 그것을 다 사용하면 deinit()을 통해서 메모리에서 내려준다.
    - swift에서는 ARC를 통해서 메모리 해제를 관리
    - deinit{ }을 통해서 메모리가 해제되는 시점에서의 동작을 구현할 수 있지만, 자동으로 호출이 되는 것으로 직접 호출을 하여 그 시점을 지정할 수는 없다.

RxSwift에서는

Observable.of(1, 2, 3)
    .subscribe{
        print($0)
    }

위와 같은 코드가 있다고 가정하면, return으로 Disposable을 생성한다.

  • Disposable은 사용 후 버리는 리소스를 말한다.
  • 이를 처리하기 위해서 error나 completed 등으로 더이상 구독하지 않는 상태가 되었을 때 정리하도록 dispose() 함수를 정의

🙋 근데 왜 위의 함수에서 Disposable 이 나오지?

👉 그것은 간단. subscribe가 Disposable을 리턴하기 때문이다. (당연함)

그럼 이 Disposable이 어떻게 생겼는지 살펴 보자.

# Disposable

  • Disposable프로토콜이다. 그런데 func dispose()를 가진.. (간단)
  • 생각해보면, 그래서 subscribe를 한 다음에 나온 결과값에 대해서 .dispose() 를 할 수 있었던 것이다.
Observable.of(1, 2, 3)
    .subscribe {
        print($0)
    }
    .dispose()

↑ 이렇게..

# dispose()

🙋 근데 저기에서 말하는 dispose() 가 뭔데?

👉 프로토콜 Disposable에서 dispose()의 주석을 보면 ‘Dispose resource’라고 적혀있다.
👉 그리고 문서를 보면, 모든 옵저버들과 방출된 리소스들에 대해서 구독을 해제하는 것이다.(= 메모리 정리)

  • 이를 RxSwift를 사용하지 않고 직접 구현해 준다면, 다음과 같이 메모리가 해제되는 시점에 dispose()를 호출해 주면 된다.
final class RxExViewController: UIViewController {
    private var subscription: Disposable?
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        subscription = Observable.of(1, 2, 3)
            .subscribe {
                print($0)
            }
    }
 
    deinit {
        subscription?.dispose()
    }
}

#DisposeBag()

🙋 그런데 여기에서, 해제를 해야 하는 것이, subscribe하나가 아니라 여러개라면 어떻게 할까?

deinit {
        subscription1?.dispose()
				subscription2?.dispose()
				subscription3?.dispose()
				// ...
    }

이렇게 처리해야할 일이 굉장히 많아질 것이다.

👉 그래서 이를 간단하게 구현하기 위해서 배열에 넣어서 dispose()를 하는 것을 생각할 수 있다.(당연)

final class RxExViewController: UIViewController {
    private var subscriptions: [Disposable] = []
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
				// sbuscribe로부터 리턴된 Disposable을 subscriptions배열에 넣는다.
        subscriptions.append(Observable.of(1, 2, 3)
            .subscribe {
                print($0)
            })
    }
 
    deinit {
				// forEach를 통해 배열을 순회하면서 dispose()시키기
        subscriptions.forEach {
						$0.dispose()
				}
    }
}

⇒ 이를 RxSwift에서 구현해 놓은 것이 바로 DisposeBag이다!

글이 너무 길어진 것 같으니 다음으로...
🔗 DisposeBag() 정복하기 2편

🔖 참고

profile
🍫 iOS 🍫 Swift

0개의 댓글