【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のどれを流しても何も起こらない
この記事を書いた人
あきお(@akio0911
iOSエンジニア、ブロガー。「プログラミングで人々を幸せに」をテーマに活動中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。 MAMORIO株式会社 技術顧問(インタビュー記事)、VISITS Technologies株式会社 技術顧問(インタビュー記事)。ブログ「卵は世界である」を運営。

関連記事

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

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

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

プログラミング未経験者向けのプログラミング入門連載記事を始めます

こんにちは、@akio0911です。 これからプログラミング未経

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

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

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

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

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

→もっと見る

PAGE TOP ↑