0Pricing
Swift Academy · Aula

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

Verificaçã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

  1. URLSession data(from:) com async/await
  2. Codable: codificação e decodificação de JSON
  3. Tratamento de erros e códigos de status HTTP
  4. Lógica de novas tentativas e URLSession em segundo plano
← Voltar para Swift Academy