Cache em Swift: Redis, Memcached e soluções nativas para iOS/macOS

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cache em Swift: Redis, Memcached e soluções integradas



Cache é uma das ferramentas-chave para melhorar o desempenho e a capacidade de resposta de aplicativos Swift para iOS e macOS. Neste artigo, analisaremos três abordagens principais: soluções integradas (NSCache, URLCache), bem como sistemas externos (Redis e Memcached). Você aprenderá quando e qual ferramenta escolher e obterá exemplos de código prontos.



Por que o cache é necessário em aplicativos Swift?

Sem cache, cada acesso a dados (rede, disco, banco de dados) sobrecarrega o sistema e aumenta o tempo de resposta. O cache permite armazenar dados usados com frequência na memória RAM, reduzindo latências e a carga no servidor. Para dispositivos móveis, isso é especialmente importante: economia de tráfego, bateria e melhoria da UX.



1. Soluções integradas: NSCache e URLCache

A Apple fornece duas ferramentas integradas poderosas: NSCache para cache geral de objetos e URLCache para cache de requisições de rede.



NSCache

NSCache é um cache thread-safe que gerencia a memória automaticamente. Ele remove objetos quando há falta de memória, o que é ideal para iOS.



import Foundation

class ImageCacheManager { static let shared = ImageCacheManager() private let cache = NSCache<NSString, UIImage>() private init() { cache.countLimit = 100 // Máximo de 100 imagens cache.totalCostLimit = 50 * 1024 * 1024 // 50 MB } func getImage(for key: String) -> UIImage? { return cache.object(forKey: key as NSString) } func setImage(_ image: UIImage, for key: String, cost: Int = 0) { cache.setObject(image, forKey: key as NSString, cost: cost) } func removeImage(for key: String) { cache.removeObject(forKey: key as NSString) } func clearCache() { cache.removeAllObjects() }}


URLCache

URLCache armazena em cache automaticamente respostas HTTP. Ele pode ser configurado para uma sessão URLSession específica.



import Foundation

// Configuração do URLCachelet memoryCapacity = 50 * 1024 * 1024 // 50 MBlet diskCapacity = 100 * 1024 * 1024 // 100 MBlet cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")

let configuration = URLSessionConfiguration.defaultconfiguration.urlCache = cacheconfiguration.requestCachePolicy = .returnCacheDataElseLoad

let session = URLSession(configuration: configuration)

// Exemplo de requisiçãolet url = URL(string: "https://api.example.com/data")!let task = session.dataTask(with: url) { data, response, error in if let data = data { // Os dados podem vir do cache print("Recebidos \\(data.count) bytes") }}task.resume()


2. Redis para Swift: cache no lado do servidor

Redis é um banco de dados in-memory, frequentemente usado para cache no lado do servidor. Para Swift, existem bibliotecas populares como Vapor Redis (para Vapor) ou RediStack (para qualquer projeto).



Exemplo com RediStack

import RediStackimport NIOCoreimport NIOPosix

// Conexão ao Redislet eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)let connection = try RedisConnection.make( configuration: .init(hostname: "localhost", port: 6379), boundEventLoop: eventLoopGroup.next()).wait()

// Definir valortry connection.set("user:123", to: "{\\"name\\": \\"Alice\\", \\"age\\": 30}").wait()

// Obter valorlet result = try connection.get("user:123", as: String.self).wait()print("Obtido do Redis: \\(result ?? "nil")")

// Fechar conexãotry connection.close().wait()try eventLoopGroup.syncShutdownGracefully()

Blogs

Book Recommendations