Combine

概要

SwiftUIにおける<strong>Combine</strong>は、変数の監視、変更の通知、そしてその変更に対する非同期的な処理の流れ(パイプライン)を宣言的に設定できるフレームワークです。

Combineの役割

Combineの主要な機能と、それが「変数の監視、処理を自由に設定できる」という認識にどう結びつくかをご説明します。

通知が発行されてからビューが受け取るまでの間に、Operators(演算子)を使ってデータを変換したり、フィルタリングしたり、結合したりといった「処理を自由に設定」できます。

変数の監視と公開(Publishers):
ObservableObject@PublishedプロパティがCombineの核となります。
@Publishedを付けた変数はPublisher(発行者)となり、その値が変更されるたびに通知(イベント)を発行します。これにより、変数の「監視」が実現します。

通知の受信と処理(Subscribers & Operators):
@ObservedObject@EnvironmentObject@StateObjectが付いたView(ビュー)は、これらの通知を自動的に受け取って(Subscribeして)再描画します。

Combineが実現するもの

機能概要
データフローの宣言データの流れ(いつ、どこで、どのようにデータが変化し、どこで使われるか)をコードで明確に定義します。
非同期処理ネットワークリクエストやタイマーなどの非同期イベントの処理を、構造化された統一的な方法で扱えます。
リアクティブプログラミングデータの変化に「反応」して処理が実行される、リアクティブ(反応的)なアーキテクチャを可能にします。

🔧 構成概要

🧩 コード例

⚙️ 仕組みの説明

  1. expiresAt が更新されるたびに Combine が購読開始。
  2. 残り時間から「5分前にJustイベントを発火」する Publisher を生成。
  3. そのタイミングで refreshTokenIfNeeded() を呼び出す。
  4. 更新すると expiresAt が再度変わるので、監視がリセットされる。

これで「トークンの期限が近づくと自動更新」のループが自然に構築されます!

🧠 メリット

  • ViewやAPI処理から独立して動く(完全自動)
  • 1か所で有効期限を管理できる
  • Combineなのでメモリリークしにくい
  • SwiftUIの.task {}Timerを使うより安定

🧪 Viewでの使い方例

起動してから30分ごとに自動更新、
または「Fetch New Token」ボタンで手動更新できます。

🧩 拡張のヒント

このCombine監視を応用すると:

  • トークン更新時に他のAPIクラスへ通知(NotificationCenter@Published購読)
  • 期限切れ検出でUIにアラート表示
  • 複数のアプリ共通トークンでも安全管理

なども可能です。

修飾子

修飾子役割
.compactMap { $0 }「nilを無視して値だけ通す」
.flatMap { ... }「受け取った値を新しいPublisherに変換して流す」
渡す値の型が違う時にキャストする所
.eraseToAnyPublisher()「型をシンプルに隠す」
.sink { [weak self] _ in ... }「最終的な購読者(subscriber)」
実行処理を書く所
.store(in: &cancellables)「購読を保持(解除されないようにする)」
Combine継続処理させる条件

✅ 拡張例

もし将来的に「アプリがバックグラウンドになったら停止」「フォアグラウンドに戻ったら再開」もしたければ、
以下のように Combine で NotificationCenter を監視して制御できます。

✅ 自動で1分おきにAPIを再取得するViewModel例

🧭 解説ポイント

項目内容
Timer.publishCombineの TimerPublisher を使って定期的にイベントを流す。autoconnect() で自動起動。
.prepend(Date())起動時に即1回発火させる(初期表示用)。
Taskキャンセル新しい更新が始まる前に前の通信を止める。これによりAPIの多重呼び出し防止。

コメント

タイトルとURLをコピーしました