Swift Academy · Lektion

Försökslogik och URLSession i bakgrunden

Implementera exponentiell backoff och fortsätt nedladdningar i bakgrunden.

Lektion 4 av 413 steg

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 + delegate

Snabb 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.

Gratis att börja

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

  1. URLSession data(from:) med async/await
  2. Codable: koda och avkoda JSON
  3. Felhantering och HTTP-statuskoder
  4. Försökslogik och URLSession i bakgrunden
← Tillbaka till Swift Academy