【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

RxSwiftにおいて、completedかerrorが流れてきたらsubscribeがdisposeされます。
以下、その挙動についてコードを書いて検証してみます。
検証コード
まずは以下のようなコードを書き、onNext, onError, onCompleted, onDisposedの各タイミングでprintすることで挙動が調べられるようにしました。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
private struct Error: Swift.Error {}
private let disposeBag = DisposeBag()
private let subject = PublishSubject<Int>()
override func viewDidLoad() {
super.viewDidLoad()
subject.subscribe(onNext: { (num) in
print("onNext", num)
}, onError: { error in
print("onError", error)
}, onCompleted: {
print("onCompleted")
}, onDisposed: {
print("onDisposed")
}).disposed(by: disposeBag)
}
}
nextが流れてきた場合
以下のコードでnextを流してみます。
subject.onNext(1) subject.onNext(2) subject.onNext(3)
出力結果は以下の通りで、流れてきたnextに対してonNextが実行されていることが分かります。
onNext 1
onNext 2
onNext 3
completedが流れてきた場合
以下のコードでnext, completed, errorを流してみます。
subject.onNext(1) subject.onNext(2) subject.onNext(3) subject.onCompleted() subject.onNext(4) subject.onNext(5) subject.onNext(6) subject.onCompleted() subject.onError(Error())
出力結果は以下の通り。completedが流れてくるとsubscribeが解除され、以降next/completed/errorのどれが流れてきても何も起こりません。
onNext 1
onNext 2
onNext 3
onCompleted
onDisposed
errorが流れてきた場合
以下のコードでnext, completed, errorを流してみます。
subject.onNext(1) subject.onNext(2) subject.onNext(3) subject.onError(Error()) subject.onNext(4) subject.onNext(5) subject.onNext(6) subject.onCompleted() subject.onError(Error())
出力結果は以下の通り。errorが流れてくるとsubscribeが解除され、以降next/completed/errorのどれが流れてきても何も起こりません。
onNext 1
onNext 2
onNext 3
onError Error()
onDisposed
まとめ
- completedかerrorが流れてくると、subscribeは解除される
- subscribeが解除されると、next/completed/errorのどれを流しても何も起こらない
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!



