👩💻 새롭게 공부하며 작성한 글이기 때문에 틀린 정보가 있을 수 있습니다! 이에 대한 피드백은 언제나 환영입니다 🙌
deinit{ }
을 통해서 메모리가 해제되는 시점에서의 동작을 구현할 수 있지만, 자동으로 호출이 되는 것으로 직접 호출을 하여 그 시점을 지정할 수는 없다.Observable.of(1, 2, 3)
.subscribe{
print($0)
}
위와 같은 코드가 있다고 가정하면, return으로 Disposable
을 생성한다.
Disposable
은 사용 후 버리는 리소스를 말한다.dispose()
함수를 정의🙋 근데 왜 위의 함수에서 Disposable
이 나오지?
👉 그것은 간단. subscribe가 Disposable을 리턴하기 때문이다. (당연함)
그럼 이 Disposable
이 어떻게 생겼는지 살펴 보자.
Disposable
은 프로토콜이다. 그런데 func dispose()
를 가진.. (간단).dispose()
를 할 수 있었던 것이다.Observable.of(1, 2, 3)
.subscribe {
print($0)
}
.dispose()
↑ 이렇게..
🙋 근데 저기에서 말하는 dispose()
가 뭔데?
👉 프로토콜 Disposable에서 dispose()의 주석을 보면 ‘Dispose resource’라고 적혀있다.
👉 그리고 문서를 보면, 모든 옵저버들과 방출된 리소스들에 대해서 구독을 해제하는 것이다.(= 메모리 정리)
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()
}
}
🙋 그런데 여기에서, 해제를 해야 하는 것이, 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()
}
}
}
글이 너무 길어진 것 같으니 다음으로...
🔗 DisposeBag() 정복하기 2편