【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 までお知らせください!

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

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

Twitterで更新情報をゲット!

PAGE TOP ↑