0Pricing
Swift Academy · Lektion

Wiederholungslogik und Hintergrund-URLSession

Implementieren Sie exponentielles Backoff und setzen Sie Downloads im Hintergrund fort.

Wiederholungslogik und Hintergrund-URLSession ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Wiederholungsversuche?

Vorübergehende Fehler (Zeitüberschreitungen, 503 Service Unavailable) können behoben werden. Eine Wiederholungslogik erhöht die Robustheit ohne Eingreifen der Benutzer.

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

Exponentielles Backoff

Warten Sie zwischen Wiederholungsversuchen zunehmend länger, damit ein überlasteter Server nicht zusätzlich belastet wird: 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 gegen den Thundering-Herd-Effekt

Fügen Sie den Backoff-Verzögerungen einen zufälligen Jitter hinzu, damit wiederholende Clients nicht alle gleichzeitig auf den Server zugreifen.

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

Wiederholbare und nicht wiederholbare Fehler

Wiederholen Sie nur vorübergehende Fehler. Clientfehler (401, 400) sollten nicht erneut versucht werden.

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 im Hintergrund

Eine Hintergrundsitzung setzt Downloads auch dann fort, wenn Ihre App angehalten oder beendet wurde.

let config = URLSessionConfiguration.background(withIdentifier: "com.myapp.background")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

URLSessionDelegate für Hintergrundaufgaben

Implementieren Sie URLSessionDelegate, um Abschluss-Callbacks zu empfangen, wenn die App nach Abschluss einer Hintergrundaufgabe erneut gestartet wird.

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
  let dest = documentsURL.appendingPathComponent("download.pdf")
  try? FileManager.default.moveItem(at: location, to: dest)
}

Handler für die Aktualisierung der App im Hintergrund

Speichern Sie in AppDelegate den Abschluss-Handler für den Hintergrund und rufen Sie ihn auf, wenn alle Tasks abgeschlossen sind.

func application(_ app: UIApplication, handleEventsForBackgroundURLSession id: String, completionHandler: @escaping () -> Void) {
  backgroundCompletionHandler = completionHandler
}
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
  DispatchQueue.main.async { self.backgroundCompletionHandler?() }
}

Download-Task mit einer Hintergrundsitzung

Verwenden Sie downloadTask(with:) mit einer Hintergrundsitzung für robuste Downloads großer Dateien.

let task = session.downloadTask(with: URL(string: "https://cdn.example.com/large.zip")!)
task.resume()

Upload-Task im Hintergrund

Hintergrundsitzungen unterstützen auch Upload-Tasks, die fortgesetzt werden, wenn die App nicht ausgeführt wird.

var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let task = session.uploadTask(with: request, fromFile: localFileURL)
task.resume()

Fortschritt überwachen

Beobachten Sie URLSessionTaskDelegate, um den Fortschritt von Uploads und Downloads für UI-Aktualisierungen zu verfolgen.

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

Wiederholungsversuche mit Hintergrundaufgaben kombinieren

Verwenden Sie Wiederholungsversuche im Vordergrund für API-Aufrufe und Hintergrundsitzungen für lang laufende Downloads und Uploads.

// API calls: async/await + exponential backoff retry
// Large downloads: URLSessionConfiguration.background + delegate

Kurze Überprüfung

Welche Technik verhindert, dass wiederholende Clients genau im selben Moment auf den Server zugreifen?

Zusammenfassung der Lektion

Implementieren Sie für vorübergehende Fehler Wiederholungsversuche mit exponentiellem Backoff und Jitter. Wiederholen Sie nur 5xx- und Timeout-Fehler. Verwenden Sie URLSessionConfiguration.background mit einem Delegate für Downloads und Uploads, die das Anhalten der App überstehen müssen.

Häufig gestellte Fragen

Ist die Lektion „Wiederholungslogik und Hintergrund-URLSession“ kostenlos?

Ja — der vollständige Text von „Wiederholungslogik und Hintergrund-URLSession“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Wiederholungslogik und Hintergrund-URLSession“?

Implementieren Sie exponentielles Backoff und setzen Sie Downloads im Hintergrund fort. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Wiederholungslogik und Hintergrund-URLSession“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. URLSession data(from:) mit async/await
  2. Codable: JSON kodieren und dekodieren
  3. Fehlerbehandlung und HTTP-Statuscodes
  4. Wiederholungslogik und Hintergrund-URLSession
← Zurück zu Swift Academy