【RxSwift】ストリームのcompletedをつぶす(消し去る)方法
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
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 までお知らせください!
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!