Caching in Swift: Redis, Memcached und integrierte Lösungen – Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Caching der Schlüssel zur Leistung von Swift-Anwendungen ist



In der modernen Swift-Entwicklung, sei es eine iOS-App oder eine Serverlösung mit Vapor, hängen die Geschwindigkeit und die Reaktionsfähigkeit der Benutzeroberfläche direkt von einer effizienten Datenverwaltung ab. Caching ist nicht nur das „Merken“ von Ergebnissen, sondern eine ganze Wissenschaft darüber, wie man die Zugriffszeit auf Daten verkürzt, die Netzwerk- und Datenbanklast reduziert und selbst bei Spitzenlasten einen reibungslosen Betrieb gewährleistet.



Auf fortgeschrittenem Niveau stehen Swift-Entwickler vor der Wahl: Sollen integrierte Mechanismen (NSCache, URLCache) verwendet oder externe Systeme wie Redis und Memcached angebunden werden? Jedes dieser Werkzeuge hat seine eigene Architektur und seinen eigenen Anwendungsbereich. In diesem Artikel werden wir untersuchen, wie man diese Lösungen im Swift-Ökosystem effektiv integrieren und kombinieren kann.



1. Integrierte Lösungen: NSCache und URLCache



1.1 NSCache – Leichtgewichtiger Cache für Objekte



NSCache ist ein threadsicheres Wörterbuch, das in Foundation integriert ist. Es eignet sich ideal zum Zwischenspeichern von Objekten, deren Erstellung oder Laden teuer ist (z. B. Bilder, Ergebnisse komplexer Berechnungen). Der Hauptvorteil ist die automatische Bereinigung bei Speicherknappheit, was für mobile Anwendungen entscheidend ist.



import Foundation

final class ImageCache { static let shared = ImageCache() private let cache = NSCache<NSString, UIImage>() private init() { cache.countLimit = 100 // Maximal 100 Objekte 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? = nil) { if let cost = cost { cache.setObject(image, forKey: key as NSString, cost: cost) } else { cache.setObject(image, forKey: key as NSString) } } func removeImage(for key: String) { cache.removeObject(forKey: key as NSString) } func clearAll() { cache.removeAllObjects() }}


Wichtige Nuancen:

  • countLimit und totalCostLimit sind Empfehlungen, keine harten Grenzen. Das System entscheidet selbst, wann Objekte entfernt werden.
  • Die Schlüssel müssen vom Typ NSString sein, nicht String (Swift überbrückt sie automatisch, aber eine explizite Umwandlung ist besser).
  • NSCache sollte nicht für große Datenmengen verwendet werden, die nicht in den Arbeitsspeicher passen.


1.2 URLCache – Caching von Netzwerkanfragen



URLCache ist ein systemeigener Cache für HTTP-Anfragen. Er speichert Serverantworten automatisch (unter Berücksichtigung der Cache-Control-Header) und gibt sie ohne Netzwerkzugriff zurück. Die Konfiguration ermöglicht die Kontrolle über den Speicher- und Festplattenumfang.



import Foundation

// URLCache für die gesamte Anwendung konfigurierenlet memoryCapacity = 20 * 1024 * 1024 // 20 MBlet diskCapacity = 100 * 1024 * 1024 // 100 MBlet cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")URLCache.shared = cache

// Beispiel für die Verwendung mit URLSessionlet config = URLSessionConfiguration.defaultconfig.requestCachePolicy = .returnCacheDataElseLoad // Zuerst Cache, dann Netzwerkconfig.urlCache = cache

let session = URLSession(configuration: config)let url = URL(string: "https://api.example.com/data")!let task = session.dataTask(with: url) { data, response, error in // Daten werden aus dem Cache geholt, falls vorhanden und nicht veraltet}task.resume()


Fortgeschrittener Tipp: Verwenden Sie für eine erzwungene Cache-Aktualisierung die Richtlinie .reloadIgnoringLocalCacheData und für die manuelle Verwaltung die Methoden cachedResponse(for:) und storeCachedResponse(_:for:).



2.

Blogs

Buchempfehlungen