Introdução: Por que usar cache em aplicações Swift?
\nCache é uma das principais técnicas de otimização de desempenho para aplicações móveis e servidores. No mundo Swift (iOS/macOS), um cache adequado permite reduzir o tempo de carregamento de dados, diminuir a carga na rede e no banco de dados, além de melhorar a experiência do usuário. Neste artigo, abordaremos três abordagens principais para cache em Swift: a solução nativa NSCache, os populares sistemas servidores Redis e Memcached, e sua integração em projetos iOS/macOS.
1. Cache nativo: NSCache e URLCache
\nPara a maioria das aplicações iOS, não são necessários servidores externos — os mecanismos nativos da Apple são suficientes.
\n\n1.1 NSCache — cache simples e eficiente em memória
\nNSCache é um dicionário thread-safe que remove objetos automaticamente quando há falta de memória. Ideal para cache de imagens, respostas JSON ou qualquer objeto de computação custosa.
import Foundation\n\nclass ImageCache {\n private let cache = NSCache<NSString, NSData>()\n\n func setImageData(_ data: Data, forKey key: String) {\n cache.setObject(data as NSData, forKey: key as NSString)\n }\n\n func getImageData(forKey key: String) -> Data? {\n return cache.object(forKey: key as NSString) as Data?\n }\n}\nDica: Configure os limites countLimit e totalCostLimit para um desempenho ideal.
1.2 URLCache — cache de requisições de rede
\nURLCache armazena respostas HTTP em cache no disco e na memória automaticamente. A configuração é feita através de URLSessionConfiguration:
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024, // 50 MB\n diskCapacity: 100 * 1024 * 1024, // 100 MB\n diskPath: "myCache")\nlet session = URLSession(configuration: config)\nIsso é especialmente útil para conteúdo estático (imagens, respostas de API com longa vida útil).
\n\n2. Redis em projetos Swift
\nRedis é um armazenamento de dados in-memory com suporte a estruturas (strings, listas, hashes). Em projetos Swift Server-side (Vapor, Perfect), Redis é usado para sessões, filas e cache rápido.
\n\n2.1 Conectando Redis via Vapor
\nO Vapor fornece o pacote vapor/redis. Instalação:
// Package.swift\ndependencies: [\n .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]\nExemplo de cache de dados de usuário:
\nimport Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n let key = "user:\\(user.id)"\n let data = try JSONEncoder().encode(user)\n try await request.redis.set(key, to: data)\n // Configuração de TTL (tempo de vida) de 1 hora\n try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n let key = "user:\\(id)"\n guard let data = try await request.redis.get(key, as: Data.self) else {\n return nil\n }\n return try JSONDecoder().decode(User.self, from: data)\n}\n\n2.2 Vantagens do Redis para Swift
\n- \n
- Velocidade: dados armazenados em RAM — latência inferior a um milissegundo. \n
- TTL: expiração automática de chaves. \n
- Pub/Sub: comunicação assíncrona entre serviços. \n
3. Memcached: cache distribuído leve
\nMemcached é um sistema de cache mais antigo, mas ainda popular. Ao contrário do Redis, ele não suporta estruturas de dados complexas ou persistência, mas é extremamente simples e eficiente para cache chave-valor.
\n\n3.1 Integração do Memcached em Swift
Blogs
Book Recommendations
Leia também
Implantação de Kotlin no Kubernetes: guia básico
PHP no LeetCode: como resolver problemas e turbinar suas habilidades
Princípios SOLID em C++: teoria e prática com exemplos de código
Kotlin Boolean? em if: como não perder desempenho
O tipo 'string' não pode ser atribuído ao tipo: como entender e corrigir o erro TypeScript
Blogs
Book Recommendations
Leia também
Princípios SOLID em C++: teoria e prática com exemplos de código