Swift Academy · Lekcja

URLSession data(from:) z async/await

Asynchroniczne pobieranie danych z interfejsów REST API za pomocą nowoczesnego API URLSession.

Lekcja 1 z 413 kroki

URLSession data(from:) z async/await to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Nowoczesne API URLSession

Swift 5.5+ udostępnia w URLSession asynchroniczne przeciążenia: data(from:delegate:), które zawieszają wykonanie zamiast używać wywołań zwrotnych.

let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)

Pełna funkcja pobierania

Należy opakować wywołanie w asynchroniczną funkcję zgłaszającą błędy, aby można ją było łatwo łączyć i testować.

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)
}

Wywoływanie ze SwiftUI

Funkcje asynchroniczne należy wywoływać z modyfikatora .task lub z poziomu Task { } wewnątrz akcji przycisku.

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 dla niestandardowych nagłówków

Należy utworzyć URLRequest z metodą, nagłówkami i treścią, a następnie przekazać go do 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)

Sprawdzanie statusu HTTP

Należy rzutować odpowiedź na HTTPURLResponse i sprawdzić kod statusu przed dekodowaniem.

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)

Anulowanie

Anulowanie nadrzędnego obiektu Task automatycznie anuluje trwające żądanie URLSession.

let task = Task {
  let items = try await fetchItems()
  // ...
}
task.cancel() // cancels URLSession request if in-flight

Wysyłanie danych

Należy użyć upload(for:from:), aby asynchronicznie wysyłać dane binarne lub formularze.

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)

Pobieranie plików

download(from:) pobiera plik do tymczasowego adresu URL na dysku zamiast do pamięci.

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)

Niestandardowa konfiguracja URLSession

Należy utworzyć niestandardową sesję z limitami czasu, zasadami buforowania i obsługą pracy w tle.

let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)

async bytes do strumieniowania

Należy użyć bytes(from:), aby strumieniowo przetwarzać dane odpowiedzi wiersz po wierszu bez buforowania całej odpowiedzi.

let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
  print(line)
}

Testowanie za pomocą URLProtocol

Odpowiedzi sieciowe w testach można symulować, dziedzicząc po URLProtocol i wstrzykując go do niestandardowej konfiguracji sesji.

class MockURLProtocol: URLProtocol {
  static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
  // override canInit, startLoading, stopLoading
}

Szybkie sprawdzenie

Która asynchroniczna metoda URLSession pobiera odpowiedź URL bezpośrednio do tymczasowego pliku na dysku?

Podsumowanie lekcji

Do asynchronicznych żądań GET należy używać URLSession.shared.data(from:), do żądań POST/PUT z niestandardowym URLRequest — data(for:), do pobierania plików — download(from:), a do strumieniowania — bytes(from:). Przed dekodowaniem zawsze należy sprawdzić kod statusu HTTP.

Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „URLSession data(from:) z async/await” jest bezpłatna?

Tak — pełny tekst „URLSession data(from:) z async/await” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „URLSession data(from:) z async/await”?

Asynchroniczne pobieranie danych z interfejsów REST API za pomocą nowoczesnego API URLSession. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „URLSession data(from:) z async/await”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. URLSession data(from:) z async/await
  2. Codable: kodowanie i dekodowanie JSON
  3. Obsługa błędów i kody statusu HTTP
  4. Logika ponawiania i działanie URLSession w tle
← Powrót do Swift Academy