Logica di retry e URLSession in background
Implementare l’exponential backoff e continuare i download in background.
Logica di retry e URLSession in background è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Perché ritentare?
I problemi temporanei, come i timeout e 503 Service Unavailable, possono essere recuperati. La logica di retry migliora la resilienza senza richiedere l'intervento dell'utente.
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")
}Backoff esponenziale
Attenda sempre più a lungo tra un tentativo e l'altro per evitare di sovraccaricare un server in difficoltà: 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 per evitare il thundering herd
Aggiunga un jitter casuale ai ritardi del backoff, così i client che ritentano non raggiungeranno tutti il server nello stesso momento.
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))Errori ritentabili e non ritentabili
Ritenti solo in caso di errori temporanei. Gli errori del client (401, 400) non devono essere ritentati.
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 in background
Una sessione in background continua i download anche quando l'app è sospesa o terminata.
let config = URLSessionConfiguration.background(withIdentifier: "com.myapp.background")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)URLSessionDelegate per il background
Implementi URLSessionDelegate per ricevere le callback di completamento quando l'app viene riavviata dopo la conclusione di un'attività in background.
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let dest = documentsURL.appendingPathComponent("download.pdf")
try? FileManager.default.moveItem(at: location, to: dest)
}Gestore di Background App Refresh
In AppDelegate, salvi il gestore di completamento del background e lo chiami quando tutte le attività sono terminate.
func application(_ app: UIApplication, handleEventsForBackgroundURLSession id: String, completionHandler: @escaping () -> Void) {
backgroundCompletionHandler = completionHandler
}
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
DispatchQueue.main.async { self.backgroundCompletionHandler?() }
}Attività di download con una sessione in background
Utilizzi downloadTask(with:) su una sessione in background per scaricare in modo affidabile file di grandi dimensioni.
let task = session.downloadTask(with: URL(string: "https://cdn.example.com/large.zip")!)
task.resume()Attività di upload in background
Le sessioni in background supportano anche le attività di upload, che continuano quando l'app non è in esecuzione.
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let task = session.uploadTask(with: request, fromFile: localFileURL)
task.resume()Monitoraggio dell'avanzamento
Osservi URLSessionTaskDelegate per monitorare l'avanzamento di upload e download e aggiornare l'interfaccia.
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 }
}Combinare retry e background
Utilizzi il retry in primo piano per le chiamate API e le sessioni in background per i download e gli upload di lunga durata.
// API calls: async/await + exponential backoff retry
// Large downloads: URLSessionConfiguration.background + delegateVerifica rapida
Quale tecnica impedisce ai client che ritentano di raggiungere tutti il server nello stesso momento?
Riepilogo della lezione
Implementi il retry con backoff esponenziale e jitter per gli errori temporanei. Ritenti solo in caso di errori 5xx e timeout. Utilizzi URLSessionConfiguration.background con un delegate per i download e gli upload che devono sopravvivere alla sospensione dell'app.
Domande Frequenti
La lezione «Logica di retry e URLSession in background» è gratuita?
Sì — il testo completo di «Logica di retry e URLSession in background» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Logica di retry e URLSession in background»?
Implementare l’exponential backoff e continuare i download in background. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Logica di retry e URLSession in background»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- URLSession data(from:) con async/await
- Codable: codifica e decodifica JSON
- Gestione degli errori e codici di stato HTTP
- Logica di retry e URLSession in background