URLSession data(from:) z async/await
Asynchroniczne pobieranie danych z interfejsów REST API za pomocą nowoczesnego API URLSession.
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-flightWysył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
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.
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
- URLSession data(from:) z async/await
- Codable: kodowanie i dekodowanie JSON
- Obsługa błędów i kody statusu HTTP
- Logika ponawiania i działanie URLSession w tle