Försökslogik och URLSession i bakgrunden
Implementera exponentiell backoff och fortsätt nedladdningar i bakgrunden.
Försökslogik och URLSession i bakgrunden är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.
Varför göra om ett försök?
Övergående fel, till exempel tidsgränsöverskridningar och 503 Service Unavailable, kan återställas. Försökslogik gör programmet mer robust utan att användaren behöver ingripa.
func fetch(retries: Int = 3) async throws -> Data {
for attempt in 0..<retries {
do {
return try await URLSession.shared.data(from: url).0
} catch {
if attempt == retries - 1 { throw error }
}
}
fatalError("unreachable")
}Exponentiell backoff
Vänta allt längre mellan försöken för att undvika att överbelasta en hårt belastad server: 1 s, 2 s, 4 s.
for attempt in 0..<maxRetries {
do { return try await fetch() } catch {
if attempt < maxRetries - 1 {
try await Task.sleep(nanoseconds: UInt64(pow(2.0, Double(attempt))) * 1_000_000_000)
} else { throw error }
}
}Jitter för att förhindra flockeffekten
Lägg till slumpmässig jitter i backoff-fördröjningarna så att klienter som försöker igen inte alla kontaktar servern samtidigt.
let baseDelay = pow(2.0, Double(attempt))
let jitter = Double.random(in: 0..<1)
let delay = (baseDelay + jitter) * 1_000_000_000
try await Task.sleep(nanoseconds: UInt64(delay))Fel som kan försöka igen och fel som inte kan det
Försök bara igen vid övergående fel. Klientfel som 401 och 400 ska inte orsaka nya försök.
func isRetryable(_ error: Error) -> Bool {
if let urlErr = error as? URLError {
return urlErr.code == .timedOut || urlErr.code == .networkConnectionLost
}
if let netErr = error as? NetworkError, case .httpError(let code) = netErr {
return code >= 500
}
return false
}URLSession i bakgrunden
En bakgrundssession fortsätter nedladdningar även när appen är pausad eller avslutad.
let config = URLSessionConfiguration.background(withIdentifier: "com.myapp.background")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)URLSessionDelegate för bakgrundsuppgifter
Implementera URLSessionDelegate för att ta emot återkoppling när appen startas igen efter att en bakgrundsuppgift har slutförts.
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let dest = documentsURL.appendingPathComponent("download.pdf")
try? FileManager.default.moveItem(at: location, to: dest)
}Hanterare för bakgrundsuppdatering av appen
Spara bakgrundens completion-handler i AppDelegate och anropa den när alla uppgifter är klara.
func application(_ app: UIApplication, handleEventsForBackgroundURLSession id: String, completionHandler: @escaping () -> Void) {
backgroundCompletionHandler = completionHandler
}
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
DispatchQueue.main.async { self.backgroundCompletionHandler?() }
}Nedladdningsuppgift med bakgrundssession
Använd downloadTask(with:) på en bakgrundssession för robusta nedladdningar av stora filer.
let task = session.downloadTask(with: URL(string: "https://cdn.example.com/large.zip")!)
task.resume()Uppladdningsuppgift i bakgrunden
Bakgrundssessioner stöder även uppladdningsuppgifter som fortsätter när appen inte körs.
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let task = session.uploadTask(with: request, fromFile: localFileURL)
task.resume()Övervaka förlopp
Observera URLSessionTaskDelegate för att följa förloppet för uppladdningar och nedladdningar och uppdatera användargränssnittet.
func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
let progress = Double(totalBytesSent) / Double(totalBytesExpectedToSend)
DispatchQueue.main.async { self.uploadProgress = progress }
}Kombinera nya försök med bakgrundskörning
Använd försök i förgrunden för API-anrop och bakgrundssessioner för långvariga ned- och uppladdningar.
// API calls: async/await + exponential backoff retry
// Large downloads: URLSessionConfiguration.background + delegateSnabb kontroll
Vilken teknik förhindrar att klienter som försöker igen alla kontaktar servern samtidigt?
Sammanfattning av lektionen
Implementera nya försök med exponentiell backoff och jitter för övergående fel. Försök endast igen vid 5xx-fel och tidsgränsöverskridningar. Använd URLSessionConfiguration.background med en delegate för ned- och uppladdningar som måste överleva att appen pausas.
Lär dig Swift med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 122
- Lektioner
- 409
Vanliga frågor
Är lektionen ”Försökslogik och URLSession i bakgrunden” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Försökslogik och URLSession i bakgrunden”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Försökslogik och URLSession i bakgrunden”?
Implementera exponentiell backoff och fortsätt nedladdningar i bakgrunden. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Swift Academy?
Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Försökslogik och URLSession i bakgrunden”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Swift Academy-lektionen?
Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- URLSession data(from:) med async/await
- Codable: koda och avkoda JSON
- Felhantering och HTTP-statuskoder
- Försökslogik och URLSession i bakgrunden