本文へスキップ
BecomeCoder

Swift(iOSアプリ)コース · 第8章 データ・通信・公開 ― 実機で仕上げる · レッスン33

URLSession ― サーバーと通信する

ローカル実施

導入

天気、ニュース、SNSの投稿。多くのアプリはインターネット越しにデータを取ってきます。iOSでの通信の標準が URLSession、そして待ち時間を扱う async/await です。

説明

ネット通信は「返事が来るまで時間がかかる」処理です。Swiftでは、時間のかかる処理に async(非同期)を付け、その結果を待つところで await を書きます。待っている間もアプリは固まりません。

func fetchData() async throws -> String {
    let url = URL(string: "https://example.com/api")!
    let (data, _) = try await URLSession.shared.data(from: url)
    let text = String(data: data, encoding: .utf8) ?? ""
    return text
}
  • async … 「この関数は待ち時間がある」印。
  • await … 「ここで結果を待つ(その間ほかの処理は進んでよい)」印。
  • try … 通信は失敗しうるので、エラーに備える(第3章のOptionalと並ぶ「失敗の扱い」)。

SwiftUIからは、画面が現れたときなどに .task { } で非同期処理を呼びます。

struct WeatherView: View {
    @State private var text = "読み込み中…"

    var body: some View {
        Text(text)
            .task {
                text = (try? await fetchData()) ?? "取得失敗"
            }
    }
}

通信は「時間がかかる・失敗しうる」の2点が肝。async/await で待ち、try/Optionalで失敗に備える、と覚えておきましょう。

まとめ

  • 通信は URLSession.shared.data(from:)await で待つ。
  • 時間のかかる処理は async、待つ場所は await
  • SwiftUIでは .task { } から非同期処理を呼ぶ。