URLSession data(from:) com async/await
Busque dados de forma assíncrona em APIs REST usando a API moderna do URLSession.
URLSession data(from:) com async/await é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 1 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.
API moderna do URLSession
O Swift 5.5+ oferece sobrecargas assíncronas no URLSession: data(from:delegate:), que suspendem a execução em vez de usar retornos de chamada.
let (data, response) = try await URLSession.shared.data(from: URL(string: "https://api.example.com/items")!)Função completa de busca
Envolva a chamada em uma função assíncrona que lance erros para torná-la componível e testável.
func fetchItems() async throws -> [Item] {
let url = URL(string: "https://api.example.com/items")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode([Item].self, from: data)
}Chamando a partir do SwiftUI
Chame funções assíncronas a partir do modificador .task ou de Task { } dentro da ação de um botão.
struct ItemList: View {
@State private var items: [Item] = []
var body: some View {
List(items, id: \.id) { Text($0.name) }
.task { items = (try? await fetchItems()) ?? [] }
}
}URLRequest para cabeçalhos personalizados
Crie um URLRequest com método, cabeçalhos e body, depois passe-o para data(for:).
var request = URLRequest(url: URL(string: "https://api.example.com/login")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(LoginBody(email: "a@b.com", password: "pass"))
let (data, _) = try await URLSession.shared.data(for: request)Verificando o status HTTP
Converta a resposta para HTTPURLResponse e verifique o código de status antes de decodificá-la.
let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse, http.statusCode == 200 else {
throw URLError(.badServerResponse)
}
let item = try JSONDecoder().decode(Item.self, from: data)Cancelamento
Cancelar a Task pai cancela automaticamente a solicitação do URLSession que está em andamento.
let task = Task {
let items = try await fetchItems()
// ...
}
task.cancel() // cancels URLSession request if in-flightEnviando dados
Use upload(for:from:) para enviar dados binários ou formulários de forma assíncrona usando POST.
var request = URLRequest(url: uploadURL)
request.httpMethod = "POST"
let (data, _) = try await URLSession.shared.upload(for: request, from: imageData)Baixando arquivos
download(from:) baixa um arquivo para uma URL temporária no disco, em vez de mantê-lo na memória.
let (fileURL, _) = try await URLSession.shared.download(from: remoteURL)
let destURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("file.pdf")
try FileManager.default.moveItem(at: fileURL, to: destURL)Configuração personalizada do URLSession
Crie uma sessão personalizada com limites de tempo, política de cache e suporte a tarefas em segundo plano.
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 30
config.requestCachePolicy = .reloadIgnoringLocalCacheData
let session = URLSession(configuration: config)bytes assíncronos para transmissão contínua
Use bytes(from:) para transmitir os dados da resposta linha a linha sem armazenar toda a resposta em um buffer.
let (stream, _) = try await URLSession.shared.bytes(from: url)
for try await line in stream.lines {
print(line)
}Testando com URLProtocol
Simule respostas de rede nos testes subclassificando URLProtocol e injetando-o em uma configuração de sessão personalizada.
class MockURLProtocol: URLProtocol {
static var requestHandler: ((URLRequest) throws -> (HTTPURLResponse, Data))?
// override canInit, startLoading, stopLoading
}Verificação rápida
Qual método assíncrono do URLSession baixa uma resposta de URL diretamente para um arquivo temporário no disco?
Recapitulação da lição
Use URLSession.shared.data(from:) para solicitações GET assíncronas, data(for:) com um URLRequest personalizado para POST/PUT, download(from:) para baixar arquivos e bytes(from:) para transmissão contínua. Sempre verifique o código de status HTTP antes de decodificar a resposta.
Perguntas Frequentes
A aula “URLSession data(from:) com async/await” é grátis?
Sim — o texto completo de “URLSession data(from:) com async/await” é 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 “URLSession data(from:) com async/await”?
Busque dados de forma assíncrona em APIs REST usando a API moderna do URLSession. 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 1 de 4.
Quanto tempo leva a aula “URLSession data(from:) com async/await”?
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