Reputation: 948
Reading up on Rx relays
it says that they never complete or emit errors: https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Subjects.md
let disposable: Disposable?
override func viewDidLoad() {
super.viewDidLoad()
disposable = viewModel.myRelay.subscribe(onNext: { //do stuff })
}
override func viewWillDisappear() {
super.viewWillDisappear()
disposable.dispose()
}
So hooking on .dispose(by: disposeBag)
is pointless, right?
Won't relays create memory leaks unless they are disposed
manually?
Upvotes: 1
Views: 223
Reputation: 33967
A subscription will dispose when its source emits a stop event (either completed or error) or its disposable's dispose()
is called. You are correct that Relays never emit stop events, so the only way to release the subscriptions sourced from a relay is to dispose them.
To dispose such a subscription, you can do it manually, or you can insert the disposable into a dispose bag. A DisposeBag calls dispose()
on all the disposables it contains when it is deinit
ed. So:
final class Example: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
viewModel.myRelay
.subscribe(onNext: { /* do stuff */ })
.disposed(by: disposeBag)
}
}
Is sufficient, and best practice.
Upvotes: 2