URLSession.shared
SwiftUI アプリで外部 API からデータを取得する場合、URLSession.shared の後に続くメソッドは、データの扱い方や非同期処理の管理方法によって使い分けられます。主に、以下の3つの方法があります。
.data(for:)
URLSession.shared.data(for:) メソッドは、Swift 5.5 で導入されたasync/await構文を使用する際に最適です。
- どのような時に使うか: シンプルで、単一の非同期リクエストを待機して結果を同期的に処理したい場合に最も適しています。コードが直線的になり、エラーハンドリングもdo-try-catchブロックで行うため、非常に読みやすくなります。
- 特徴:
- 非同期処理: async/await を利用して、コードの見た目を同期的に保ちつつ非同期処理を行います。
- エラーハンドリング: tryとcatchでエラーを捕捉します。
- Swift Concurrency: 新しい Swift の並行処理モデルに準拠しています。
- 例: ユーザーがボタンをタップした際に、特定のデータを取得してUIを更新するような単純なケース。
.dataTask(with:)
URLSession.shared.dataTask(with:) は、Completion Handler (クロージャ) を使用する従来の非同期処理方法です。
- どのような時に使うか: 主に、非同期処理をasync/awaitに移行する前のレガシーコードや、completion handlerベースの設計に慣れている場合に利用されます。
- 特徴:
- 非同期処理: 完了後に呼び出されるクロージャに、データ、レスポンス、エラーが渡されます。
- エラーハンドリング: クロージャ内のError? オブジェクトをチェックして行います。
- 可読性: 複数のネストされたクロージャ(いわゆる「コールバック地獄」)が発生しやすく、コードの可読性が低下することがあります。
- 例: 古いプロジェクトでasync/awaitへの移行がまだ進んでいない場合や、サードパーティライブラリがcompletion handlerを要求する場合。
.dataTaskPublisher(for:)
URLSession.shared.dataTaskPublisher(for:) は、Combineフレームワークの一部として提供されるメソッドです。
- どのような時に使うか: 複数の非同期処理をチェーンで繋げたり、データストリームを継続的に処理したり、リアルタイムのデータ更新を扱いたい場合に非常に強力です。
- 特徴:
- 宣言的: データの流れをパブリッシャーとサブスクライバーの概念で宣言的に記述します。
- オペレーター: map、filter、decodeなどのオペレーターをチェーンで繋げて、データの変換や加工を簡潔に行えます。
- 状態管理: @StateObject や @ObservedObject と組み合わせて、データの変更を SwiftUI のビューに自動的に反映させることができます。
- 例: データのフェッチ後にJSONをデコードし、さらに別のAPIリクエストをトリガーするような複雑なデータパイプラインを構築する場合や、MVVM (Model-View-ViewModel) パターンで ViewModel 内のデータフローを管理する場合。
まとめ
| メソッド | 主な用途 | 非同期処理モデル | 主な利点 |
.data(for:) | 単純な単一リクエスト | async/await | コードが直線的で読みやすい |
.dataTask(with:) | レガシーコードとの互換性 | Completion Handler | 従来の非同期処理 |
.dataTaskPublisher(for:) | 複雑なデータフロー、ストリーム処理 | Combine | データの変換・結合、宣言的な記述 |
URLRequest
URLSession.shared の後に続くメソッド (.data, .dataTask, .dataTaskPublisher) は、単に URL を指定するだけでなく、より詳細なリクエスト設定を必要とする場合に URLRequest を引数として受け入れます。
URLRequest を使う主な理由
- HTTP メソッドの指定:
GETだけでなく、POST、PUT、DELETEなどのメソッドを指定する場合に必須です。特に、サーバーへデータを送信する際にはPOSTを使います。 - HTTP ヘッダーの追加: 認証トークンやコンテンツタイプ (
"Content-Type": "application/json") など、リクエストヘッダーに特定の情報を追加する必要がある場合に利用します。 - リクエストボディの送信:
POSTリクエストで JSON データなどのペイロードをサーバーに送信する場合、URLRequest のhttpBodyプロパティにデータを設定します。 - キャッシュポリシーの設定: ネットワークリクエストのキャッシュ動作を細かく制御できます。
- タイムアウト値の設定: ネットワーク接続が完了するまでの最大時間を指定できます。
まとめ
URLRequest は、単に URL にアクセスするだけでなく、リクエストそのものの内容(メソッド、ヘッダー、ボディなど)を詳細にカスタマイズするためのコンテナです。
- URL のみで十分な場合: 単純な
GETリクエストで、特別なヘッダーやボディが不要な場合は、直接 URL を渡すことができます。 - 詳細な設定が必要な場合: サーバーへのデータ送信や認証が必要な場合は、URLRequest を作成し、必要なプロパティを設定してから
.data(for:)や.dataTask(with:)に渡すのが一般的な使い方です。
つまり、URLRequestは、Web APIとより高度なやり取りをするための「設定の設計図」のようなものだと考えてください。

コメント