【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エンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

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

Twitterで更新情報をゲット!

PAGE TOP ↑