【Swift/Combine】shareメソッドの使い方!publisherの共有とmulticastとの違い

この記事からわかること
- SwiftのCombineフレームワーク
- shareメソッドの使い方
- publisherを共有する方法
- multicastの使い方と違い
\ アプリをリリースしました /
環境
- Xcode:16.0
- iOS:18.0
- Swift:5.9
- macOS:Sonoma 14.6.1
shareメソッドの使い方
share
はpublisher
の出力を複数のsubscriber間で共有するためのメソッドです。使い所としてはサーバーへのリクエストなど重い処理を行うpublisher
の結果を複数の箇所から参考したい際にshare
したpublisher
を使用することで1回のサーバーリクエスト処理(ストリーム)だけで購読対象全てにOutput
もしくはError
を流すことができます。
また購読対象が1つでもあればストリームは起動しますが、複数の購読対象がいる場合は全ての購読が解除されるまでストリームは破棄されません。
実装サンプルは公式に記載されていたコードが非常にわかりやすかったです。ここでは「3回だけ0~100のランダムな数値が流れるストリーム」を2つのsubscriber
が購読しています。
出力されるログを確認すると2つのsubscriber
の結果が同じ数値になっていることが確認できます。これは同じストリームを購読しているため同じ数値になります。
試しにshare
をコメントアウトしてみると・・・
出力されるログは以下のように2つのsubscriber
で異なる数値となり別のストリームを購読していることがわかります。
購読前の値は受け取れない
share
では同じストリームを共有することができますが購読タイミングが異なる場合の挙動には注意が必要です。publisher
はコールドストリームなので購読されたタイミングで値が流れ出します。例えば以下のような「1秒ごとに現在の日時が流れるストリーム」があるとします。
subscriber
の購読タイミングを少しずらしてログを出力してみると以下のようになりSubscriber 2
では購読前に流れた13:35:55
と13:35:56
の値は受け取れていないことが確認できます。
multicastメソッドの使い方
multicast
もshare
と同じくpublisher
の出力を複数のsubscriber間で共有するためのメソッドです。1点大きく異なるのはmulticast
したpublisher
は購読してもストリームが起動しないことです。ストリームを起動させるためにはconnect
メソッドを明示的に呼びだす必要があります。
また引数には任意のsubject
を渡す必要があります。
この特性によりshare
であった「購読前の値は受け取れない」問題を解消することができます。先ほどと同じpublisher
でのコードの差分を見てみます。
出力されたログは以下のようにsubscriber
間で差分がなくなっていることがわかります。connect
メソッドを呼び出したタイミングからストリームが流れ始めるのでsubscriber1
では購読の準備だけしている状態になります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。