Lógica de novas tentativas e URLSession em segundo plano
Implemente espera progressiva e continue downloads em segundo plano.
Lógica de novas tentativas e URLSession em segundo plano é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Por que repetir?
Falhas transitórias (tempos limite, 503 Serviço indisponível) podem ser recuperadas. A lógica de repetição melhora a resiliência sem intervenção do usuário.
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")
}Espera exponencial
Aguarde períodos cada vez mais longos entre as novas tentativas para evitar sobrecarregar um servidor com dificuldades: 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 }
}
}Variação aleatória para evitar o efeito manada
Adicione uma variação aleatória aos atrasos entre tentativas para que os clientes não acessem todos o servidor ao mesmo tempo.
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))Erros que permitem novas tentativas e erros que não permitem
Repita apenas as tentativas após erros transitórios. Erros do cliente (401, 400) não devem ser repetidos.
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 em segundo plano
Uma sessão em segundo plano continua os downloads mesmo quando o app está suspenso ou encerrado.
let config = URLSessionConfiguration.background(withIdentifier: "com.myapp.background")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)URLSessionDelegate para tarefas em segundo plano
Implemente URLSessionDelegate para receber retornos de chamada de conclusão quando o app for reaberto após o término de uma tarefa em segundo plano.
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let dest = documentsURL.appendingPathComponent("download.pdf")
try? FileManager.default.moveItem(at: location, to: dest)
}Manipulador de atualização do app em segundo plano
Em AppDelegate, salve o manipulador de conclusão em segundo plano e chame-o quando todas as tarefas terminarem.
func application(_ app: UIApplication, handleEventsForBackgroundURLSession id: String, completionHandler: @escaping () -> Void) {
backgroundCompletionHandler = completionHandler
}
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
DispatchQueue.main.async { self.backgroundCompletionHandler?() }
}Tarefa de download com sessão em segundo plano
Use downloadTask(with:) em uma sessão em segundo plano para realizar downloads resilientes de arquivos grandes.
let task = session.downloadTask(with: URL(string: "https://cdn.example.com/large.zip")!)
task.resume()Tarefa de envio em segundo plano
As sessões em segundo plano também aceitam tarefas de envio que continuam quando o app não está em execução.
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let task = session.uploadTask(with: request, fromFile: localFileURL)
task.resume()Monitorando o progresso
Observe URLSessionTaskDelegate para acompanhar o progresso de envios e downloads e atualizar a interface.
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 }
}Combinando novas tentativas com execução em segundo plano
Use novas tentativas em primeiro plano para chamadas de API e sessões em segundo plano para downloads e envios de longa duração.
// API calls: async/await + exponential backoff retry
// Large downloads: URLSessionConfiguration.background + delegateVerificação rápida
Que técnica impede que os clientes que estão repetindo tentativas acessem todos o servidor no mesmo momento?
Recapitulação da lição
Implemente novas tentativas com espera exponencial e variação aleatória para erros transitórios. Repita apenas após erros 5xx e erros de tempo limite. Use URLSessionConfiguration.background com um delegado para downloads e envios que precisam sobreviver à suspensão do app.
Perguntas Frequentes
A aula “Lógica de novas tentativas e URLSession em segundo plano” é grátis?
Sim — o texto completo de “Lógica de novas tentativas e URLSession em segundo plano” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Lógica de novas tentativas e URLSession em segundo plano”?
Implemente espera progressiva e continue downloads em segundo plano. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Lógica de novas tentativas e URLSession em segundo plano”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- URLSession data(from:) com async/await
- Codable: codificação e decodificação de JSON
- Tratamento de erros e códigos de status HTTP
- Lógica de novas tentativas e URLSession em segundo plano