Joakim Sjöstedt
Joakim Sjöstedt

Reputation: 948

Are rx relays never disposed?

Reading up on Rx relays it says that they never complete or emit errors: https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Subjects.md

  1. Does that mean that they will never dispose unless you dispose them manually, like so:
let disposable: Disposable?

override func viewDidLoad() {
    super.viewDidLoad()

    disposable = viewModel.myRelay.subscribe(onNext: { //do stuff })
}

override func viewWillDisappear() {
    super.viewWillDisappear()

    disposable.dispose()
}

  1. So hooking on .dispose(by: disposeBag) is pointless, right?

  2. Won't relays create memory leaks unless they are disposed manually?

Upvotes: 1

Views: 223

Answers (1)

Daniel T.
Daniel T.

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 deinited. 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

Related Questions