Ferramentas

WWDC 2026: Caching AsyncImage

A WWDC 2026 apresentou a funcionalidade de caching para AsyncImage no Xcode 27, permitindo que desenvolvedores otimizem o desempenho dos aplicativos ao armazenar imagens baixadas. O tutorial do Kodeco demonstra como configurar políticas de cache e usar sessões personalizadas com AsyncImage.

Compartilhar
WWDC 2026: AsyncImage Caching | Kodeco

Quando a Concorrência do Swift surgiu há cinco anos, ela apresentou AsyncImage — veja como é fácil agora baixar e exibir uma imagem! Era rápido e divertido de usar... em um protótipo ou aplicativo de amostra, não em um aplicativo de produção que precisava de caching de imagens para eficiência e desempenho. Bem, o Xcode 27 preenche essa lacuna, trazendo o caching AsyncImage para a sua vida!

Começando

Aviso: Você precisa do Xcode 27 beta para usar o caching de AsyncImage.

Use o botão Baixar Materiais no topo ou na parte inferior deste artigo para baixar o projeto inicial.

TheMet é um aplicativo que pesquisa objetos do The Metropolitan Museum of Art, New York correspondentes ao termo de busca do usuário. Ele foi adaptado do projeto de amostra na Seção III de SwiftUI Apprentice.

O aplicativo TheMet tem um repositório TheMetStore e um serviço de rede TheMetService. A tela inicial exibe uma lista colorida de objetos do museu. Os itens azuis claros estão no domínio público, e você pode baixar imagens. Os itens vermelhos não estão no domínio público, e é necessário navegar para o site do museu para visualizar as imagens.

Clicando em um objeto que está no domínio público, a tela ObjectView exibe informações sobre o objeto e usa AsyncImage como uma maneira simples de buscar uma imagem do objeto. Clicar em um item vermelho navega para uma visualização do site do objeto na página web do Metropolitan Museum.

Caching de Imagens

AsyncImage é útil para prototipar um aplicativo, mas é ineficiente buscar uma imagem toda vez que ObjectView carrega. O desempenho do seu aplicativo é melhor se ele cachear as imagens.

Vários dos bootcamps iOS da Kodeco usaram o TheMet para ensinar listas, navegação e rede. Um exercício acima do nível básico pediu aos alunos que modificassem o projeto para cachear as imagens. Na época, isso exigia adicionar uma propriedade de dados de imagem ao Object e substituir AsyncImage por uma tarefa URLSession para baixar e armazenar os dados da imagem. O código de caching poderia ser adaptado do projeto EmojiArt em Modern Concurrency. Era muito trabalho!

O Xcode 27 adiciona caching a AsyncImage!

AsyncImage cacheará os dados da imagem baixada conforme o protocolo de transporte. O sistema criará o cache com uma configuração padrão URLSessionConfiguration. Para alterar a política de cache, especifique a mudança em URLRequest, e passe para init(request:scale:transaction:content:). Para personalizar o processo de download em uma hierarquia específica de visualização, use asyncImageURLSession(_:) para especificar um URLSession. AsyncImage usará essa sessão para realizar tarefas de dados ao baixar os dados da imagem.

Nesta tutorial, interpreto “configuração padrão URLSessionConfiguration” como significando que AsyncImage usa URLSession.shared como sua sessão padrão. Como você verá, quando AsyncImage está usando a sessão padrão, o tamanho de URLCache.shared aumentará sempre que AsyncImage baixar uma nova imagem. Você também aprenderá como alterar a política de cache e como especificar um URLSession personalizado.

Caching em Ação

A maneira mais rápida de ver o caching AsyncImage em ação é compará-lo no Xcode 26 com o que acontece no Xcode 27. Se você está lendo isso após o lançamento do Xcode 27 e não tem mais o Xcode 26, vá para a próxima seção, onde você configurará a cachePolicy de um URLRequest.

Se você estiver lendo isso enquanto o Xcode 27 ainda está em beta, abra TheMet no Xcode 26, então abra ContentView.swift e carregue sua visualização. Quando a lista de rinocerontes for carregada, toque em um dos itens azuis claros para carregar seu ObjectView.

Depois que a imagem for carregada, navegue de volta à lista. Agora, desligue o wifi no seu Mac, então toque no mesmo item azul — nenhuma imagem!

O Xcode 26 não possui caching para AsyncImage, então o ObjectView tenta — e falha — em baixar a imagem novamente.

Saia do Xcode 26, desligue o wifi, depois abra TheMet no Xcode 27. No canvas de visualização do ContentView, toque em um item azul pálido diferente, aguarde a imagem carregar no ObjectView, então volte para a lista.

Desligue o wifi, depois toque no mesmo item — AsyncImage recupera a imagem do seu cache!

Definindo Política de Cache

No ContentView, fixe sua visualização:

Agora, abra o arquivo ObjectView.swift e localize a chamada para AsyncImage(url:).

O AsyncImage usa a instância compartilhada de URLSession, que usa a configuração padrão de URLSessionConfiguration. A política de cache padrão é useProtocolCachePolicy, cuja chave comportamental é:

Se a resposta em cache não indicar que deve ser revalidada toda vez e se a resposta em cache não estiver vencida (fora da data de expiração), o sistema de carregamento de URL retorna a resposta em cache.

A documentação do Xcode fornece este diagrama útil:

As políticas de cache disponíveis são enumeradas no NSURLRequest.CachePolicy. Elas permitem ignorar dados locais e/ou remotos ou usar dados em cache possivelmente vencidos:

  • reloadIgnoringLocalCacheData: A carga da URL deve ser carregada apenas a partir da fonte original.
  • reloadIgnoringLocalAndRemoteCacheData: Ignorar dados em cache locais e instruir proxies e outros intermediários a desconsiderar seus caches conforme permitido pelo protocolo.
  • returnCacheDataElseLoad: Use os dados em cache existentes, independentemente da idade ou data de expiração, carregando apenas da fonte original se não houver dados em cache disponíveis.
  • returnCacheDataDontLoad: Use os dados em cache existentes, independentemente da idade ou data de expiração, e falhe se nenhum dado em cache estiver disponível.
  • reloadRevalidatingCacheData: Use os dados em cache se a fonte original puder validá-los; caso contrário, carregue da origem.

Você pode alterar cachePolicy em um URLRequest. Logo acima da chamada para AsyncImage(url:), há um TODO:

TODO: Criar solicitação para definir sua política de cache

Substitua isso pelo seguinte código:

let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData)

Em seguida, no próximo TODO, substitua o inicializador url:

AsyncImage(url: url) { image in

com o inicializador URLRequest:

AsyncImage(request: request) { image in

Este inicializador é novo no Xcode 27.

Agora, na visualização do ContentView, passe pelo mesmo procedimento: carregue uma imagem em ObjectView, retorne à lista, desligue o wifi, então recarregue a mesma ObjectView. Como você está ignorando dados locais em cache, não há nenhuma imagem.

Mude a política de cache para useProtocolCachePolicy e veja por si mesmo que AsyncImage recupera a imagem em cache.

Lembre-se de ligar o wifi novamente.

Exibindo o Tamanho do Cache

Você pode obter ou definir propriedades de cache em disco e na memória:

  • currentDiskUsage
  • diskCapacity
  • currentMemoryUsage
  • memoryCapacity

Rolando para baixo no ObjectView, até a última vista de texto. Logo abaixo desta, há outro TODO:

Exibir uso atual em disco

Substitua o TODO pelo seguinte código:

Text("Cache compartilhada (KB): " +
  String((URLCache.shared.currentDiskUsage / 1024)))

Sim! URLCache tem uma variável de classe shared — muito mais curta do que URLSession.shared.configuration.urlCache!

Agora, quando você toca em um item da lista, você vê quanto está no cache compartilhado:

O seu número pode ser diferente, dependendo de quantas vezes você carregou o ObjectView.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa