iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

RxSwift の Subject での Error の取り扱いに注意する

PublishSubjectonError() でError を流した場合、次回以降同一の Subject オブジェクトをサブスクライブすると、初回時に Error が流れてくるようです🧑‍🔧

具体的には下記のような感じです。

    let relay = PublishSubject<String>.init()
    let disposeBag = DisposeBag()

    func subscribeRelay() {
        relay.asObserver()
            .subscribe(onNext: { text in
                print(text)
            }, onError: { error in
                print(error)
            })
            .disposed(by: disposeBag)

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.relay.onError(FideeError.unknown)
        }
    }

    // subscribeRelay()
    // 2秒後: unknown
    // subscribeRelay()
    // 直後: unknown

まあ、基本的に Observable と同じで、onCompleted()onError() が流れた場合は、onNext() は流れてこなくなるので、次に subscribe する時は新しいオブジェクトを発行するなりすると思うので、あまり影響は無いかもしれませんが、これにより予期しないバグが発生する可能性もあるので気をつけたいですね👷‍♀️

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com