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

公開日: : iOSアプリ開発

RxSwiftで元々のストリームからcompletedをつぶす(消し去る)方法を考えてみました。

concat(Observable.never())する

結論から言うと、concat()とnever()を使うことでcompletedをつぶすことができます。以下、コード例です。

let stream1 = Observable<Int>.of(1, 2, 3)

stream1.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

print("====")

stream1.concat(Observable.never()).subscribe { event in
	print(event)
}.disposed(by: disposeBag)

以下、実行結果です。

next(1)
next(2)
next(3)
completed
====
next(1)
next(2)
next(3)

そのままsubscribeするとcompletedが流れていたストリームが、concat(Observable.never())を使うことでcompletedが流れないストリームに変化していることが分かります。

concatとは?

concatを使うと、複数のObservableの出力を連結して単一のObservableのように動作させることができます。最初のObservableによって流されたイベントのすべてが、2番目のObservableによって流されたイベントの前に流されます。

以下、使用例です。

let stream1 = Observable<Int>.of(1, 2, 3)
let stream2 = Observable<Int>.of(4, 5, 6)

stream1.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

print("====")

stream2.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

print("====")

stream1.concat(stream2).subscribe { event in
	print(event)
}.disposed(by: disposeBag)

以下、出力結果です。

next(1)
next(2)
next(3)
completed
====
next(4)
next(5)
next(6)
completed
====
next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
completed

concatを使うことでstream1からのcompletedが除去され、続けてstream2が流れるようになっています。

neverとは?

errorやcompletedも含めて、一切のイベントを発生させないObservableを作ることができます。

以下、使用例です。

print("====")

Observable<Int>.never().subscribe { event in
	print(event)
}.disposed(by: disposeBag)

print("====")

以下、実行例です。

====
====

next/error/completed、どのイベントも発生していないことが分かります。

concatでneverを後ろにくっつける

concatとneverの働きを踏まえながらさきほどのコードを読んでみましょう。

let stream1 = Observable<Int>.of(1, 2, 3)

stream1.subscribe { event in
	print(event)
}.disposed(by: disposeBag)

print("====")

stream1.concat(Observable.never()).subscribe { event in
	print(event)
}.disposed(by: disposeBag)

stream1は「next(1) -> next(2) -> next(3) -> completed」とイベントが流れるストリームです。それに対してneverはイベントが何も流れないストリームです。そしてこの2つをconcatでつなげると、stream1末尾のcompletedが除去され、そこに何も流れないneverが連結されることになります。つまり結果としてstream1のcompletedが除去されることになります。

まとめ

  • ストリームのcompletedを除去するには、concat(Observable.never())を使えば良い。

間違っている箇所や他に良い方法などがあればぜひ @akio0911 までお知らせください!

関連記事

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

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 ↑