【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で更新情報をゲット!