導入
天気、ニュース、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 { }から非同期処理を呼ぶ。