async/awaitによるURLSession data(from:)
最新のURLSession APIを使い、REST APIから非同期でデータを取得します。
「async/awaitによるURLSession data(from:)」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
最新のURLSession API
Swift 5.5以降のURLSessionには、コールバックの代わりに処理を中断するasyncオーバーロードdata(from:delegate:)が用意されています。
let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)完全なフェッチ関数
呼び出しをasyncのthrowing関数でラップし、組み合わせやすくテストしやすい形にします。
func fetchItems() async throws -> [Item] {
let url = URL(string: "https://api.example.com/items")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([Item].self, from: data)
}SwiftUIからの呼び出し
.taskモディファイアから非同期関数を呼び出すか、ボタンアクション内でTask { }を使用します。
struct ItemList: View {
@State private var items: [Item] = []
var body: some View {
List(items, id: \.id) { Text($0.name) }
.task { items = (try? await fetchItems()) ?? [] }
}
}カスタムヘッダー用のURLRequest
メソッド、ヘッダー、ボディを指定してURLRequestを作成し、data(for:)に渡します。
var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(LoginBody(email: "a@b.com", password: "pass"))
let (data, _) = try await URLSession.shared.data(for: request)HTTPステータスの確認
レスポンスをHTTPURLResponseにキャストし、デコードする前にステータスコードを確認します。
let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
throw URLError(.badServerResponse)
}
let item = try JSONDecoder().decode(Item.self, from: data)キャンセル
親のTaskをキャンセルすると、実行中のURLSessionリクエストも自動的にキャンセルされます。
let task = Task {
let items = try await fetchItems()
// ...
}
task.cancel() // cancels URLSession request if in-flightデータのアップロード
upload(for:from:)を使用して、バイナリデータやフォームデータを非同期にPOSTします。
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)ファイルのダウンロード
download(from:)は、ファイルをメモリではなくディスク上の一時URLにダウンロードします。
let (fileURL, _) = try await URLSession.shared.download(from: remoteURL)
let destURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("file.pdf")
try FileManager.default.moveItem(at: fileURL, to: destURL)カスタムURLSession構成
タイムアウト、キャッシュポリシー、バックグラウンド対応を指定してカスタムセッションを作成します。
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)ストリーミング用のasync bytes
bytes(from:)を使用すると、レスポンス全体をバッファリングせずにレスポンスデータを1行ずつストリーミングできます。
let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
print(line)
}URLProtocolによるテスト
URLProtocolをサブクラス化し、カスタムセッション構成に注入して、テスト中のネットワークレスポンスをモックします。
class MockURLProtocol: URLProtocol {
static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
// override canInit, startLoading, stopLoading
}確認問題
URLレスポンスを一時ファイルとしてディスクに直接ダウンロードするasync URLSessionメソッドはどれですか?
レッスンのまとめ
非同期GETリクエストにはURLSession.shared.data(from:)を、POSTやPUTにはカスタムURLRequestとdata(for:)を、ファイルのダウンロードにはdownload(from:)を、ストリーミングにはbytes(from:)を使用します。デコードする前に、必ずHTTPステータスコードを確認します。
よくある質問
「async/awaitによるURLSession data(from:)」レッスンは無料ですか?
はい。「async/awaitによるURLSession data(from:)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「async/awaitによるURLSession data(from:)」で何を学びますか?
最新のURLSession APIを使い、REST APIから非同期でデータを取得します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「async/awaitによるURLSession data(from:)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- async/awaitによるURLSession data(from:)
- Codable:JSONのエンコードとデコード
- エラーハンドリングとHTTPステータスコード
- リトライロジックとバックグラウンドURLSession