【SwiftUI】外部サイトからデータを取得する

外部サイトからJSON形式のデータを取得する方法を解説します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】12.0
【Swift】5.3
【iOS】14.0
【macOS】Catalina バージョン 10.15.6
スポンサーリンク

やりたい事

Appleが提供するiTunes APIにアクセスして、次のように「SwiftUI」のキーワードを含む書籍の一覧を取得し表示します。

実行例

スポンサーリンク

全体ソース

まずは全体ソースをお見せします。
次章以降で各処理の解説をします。

スポンサーリンク

データを格納する構造体の定義

Result構造体は、APIから取得した個々の書籍情報を格納する型です。
trackId以外の3プロパティは必ずしも存在していない可能性があるので、オプショナル型としています。

Response構造体は、書籍情報を格納するResult構造体の配列です。

JSON→オブジェクト変換を行う為、どちらの構造体もCodableプロトコルに準拠させます。
Codableについて知りたい場合は、別の記事「【Swift】Codableを使ったJSON変換」を参照して下さい。

スポンサーリンク

検索結果表示(UI)の定義

検索結果をリスト形式で表示するUI定義です。
検索結果を格納する空の配列(results)を生成し、バインドしています。
.onAppearモディファイアで、NavigationViewが表示された際に、loadData()メソッドを呼び出し、バインドされた配列に検索結果をロードします。

スポンサーリンク

リクエストURL(URLRequest)の生成

データ取得に使うURLを生成します。
URLクラスは引数に指定した文字列が有効なURLで無い場合はnilを返すので、guard文を使ってエラー時の処理を記述します。

書籍データ取得にはAppleが公開しているiTunes APIのサーチ機能を使用します。

各引数の意味は次の通りです。

term
検索キーワード
country
対象となる国コード。日本はjp
media
取得する商品の種類を指定。電子書籍はebook。

URLからリクエストURL(URLRequest)を生成します。
URLRequestは、URLの読み込み方法を制御する為に様々なカスタマイズが可能です(例えばGETではなくPOSTを使う等)が、今回はデフォルトのまま使います。

スポンサーリンク

リクエストの実行

URLSessionは、ネットワーク要求の管理を担当するiOSクラスです。
必要に応じて独自のセッションも作成できますが、sharedプロパティを使うとiOSが使用するために作成した共有セッションが使用できます。この共有セッションは基本的なリクエストを実行するのに適した標準セッションです。

dataTaskメソッドは、URLコンテンツの取得タスクを作成します。引数にはURLRequest、タスク完了時の処理をクロージャーで指定します。
クロージャーには次の3つのパラメーターが渡ります。

data
サーバーから返されたデータ

response
URLアクセスのレスポンス情報を格納したURLResponseオブジェクト

error
リクエストが失敗した理由を示すエラーオブジェクト。リクエストが成功した場合はnil。

リクエストが正常に完了すると、dataにリソースデータが返され、errorはnilになります。
リクエストが失敗した場合は、dataはnil、errorには失敗に関する情報が返されます。
responseには、リクエストが成功したか失敗したかに関係なく、レスポンス情報が含まれます。

重要ポイント

URLSessionオブジェクトによって生成されたタスクは自動的にバックグラウンドスレッドで実行されます。
これによりUIのインタラクティブ性を損なわずに、ネットワークリクエストの実行が可能となります。
なお、新しく初期化されたタスクは一時停止状態で開始されるため、必ず最後にresume()メソッドを呼び出してタスクを開始する必要があります。

スポンサーリンク

リクエストタスク完了時の処理

「①データ取得チェック」
サーバーからデータが取得できたか否かをチェックします。
"if let"は対象プロパティのnil判定とアンラップ処理を同時に行う、Swiftの特徴的な記述方法です。

「②JSON→Responseオブジェクト変換」
取得したJSONデータをSwiftのオブジェクトに変換します。
詳しい解説が必要な方は、別の記事「【Swift】Codableを使ったJSON変換」を参照して下さい。

「③書籍情報をUIに適用」
UIにバインドされたresultsプロパティに取得したデータを適用します。
iOSではUI関連の作業はすべてメインスレッドで行うようにして、不要な衝突を避けるのがセオリーです。
その為の仕組みが、DispatchQueue.main.asyncです。
このメソッドは、処理をクロージャーとして指定すると、メインスレッドの処理キューに追加され、現在実行中のUI処理が完了後に処理されます。
バックグラウンドスレッド側は、クロージャーの実行を待たずに、次の処理に移れます。

「④データが取得できなかった場合の処理
サーバーからデータが取得できなかった場合の処理を記述する箇所です。
エラーオブジェクトが存在する場合はエラーメッセージを、そうでない場合は固定メッセージを出力しています。

スポンサーリンク

あわせて読みたい記事

【Swift】Codableを使ったJSON変換
Codableを使ったJSON変換について解説します。
【SwiftUI】@ObservedObjectをCodable変換する方法
@ObservedObjectをCodable変換する方法について解説します。
Kindle unlimited 読み放題で読める管理人のおすすめ本です!
スポンサーリンク
SwiftUI
カピ通信