【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる

公開日: : iOSアプリ開発

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のどれを流しても何も起こらない

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【RxSwift】ストリームのcompletedをつぶす(消し去る)方法

RxSwiftで元々のストリームからcompletedをつぶす

【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる

RxSwiftにおいて、completedかerrorが流れて

init(frame:), init(coder:), awakeFromNib, prepareForInterfaceBuilder が呼ばれる条件をまとめてみた

カスタムViewを作った際に呼ばれる初期化系メソッドの条件や順

【WWDC2018】iOSエンジニア的に気になる新機能・新APIまとめ

こんにちは、@akio0911です。 先日開催されたWW

【Swift】Codableで後からキーを追加した場合の挙動

こんにちは、@akio0911です。 SwiftのCod

→もっと見る

PAGE TOP ↑