Disk Cache ist ein Mechanismus zur vorübergehenden Speicherung von Daten auf dem Datenträger eines Geräts, der iOS-Apps ermöglicht, den wiederholten Zugriff auf zuvor geladene Ressourcen zu beschleunigen. Laut Apple Developer Documentation, 2024 reduziert Disk Cache die Netzwerkauslastung, verringert die Batteriebelastung und ermöglicht den Offline-Betrieb der App. iOS bietet mehrere integrierte Caching-Mechanismen: URLCache für Netzwerkanfragen, NSCache für den Arbeitsspeicher und benutzerdefinierte Implementierungen über das Caches-Verzeichnis.
Wichtigste Punkte
Disk Cache ist eine Technologie zur vorübergehenden Speicherung von Daten auf dem permanenten Speicher des Geräts (Flash-Speicher), um nachfolgende Anfragen nach denselben Daten zu beschleunigen. Im Gegensatz zum RAM-Cache behält Disk Cache Daten nach einem Neustart der App und sogar des Geräts bei.
iOS bietet zwei Haupt-Caching-Ebenen: flüchtig (NSCache, Arbeitsspeicher) und datenträgerbasiert (URLCache, Dateisystem). Der Datenträger-Cache ist 10–100 Mal langsamer als der flüchtige Cache, aber deutlich schneller als eine Netzwerkanfrage — der Unterschied kann 2 bis 3 Größenordnungen betragen. Die optimale Strategie verwendet einen zweistufigen Cache: Arbeitsspeicher für heiße Daten und Datenträger für kalte Daten.
Laut Apple Performance Optimization Guide, 2023 reduziert ein richtig konfigurierter Disk Cache die Ladezeit von Inhalten bei wiederholter Ansicht um 60–80% und senkt den Datenverbrauch um 40–70%. Für medienreiche Anwendungen (Bilder, Video, Audio) ist Caching ein kritischer UX-Faktor.
URLCache ist eine integrierte Foundation-Klasse, die einen kombinierten Cache für URLSession-Anfragen implementiert. Sie speichert Serverantworten automatisch auf dem Datenträger und im Arbeitsspeicher und verwaltet die Cache-Größe und Invalidierungsrichtlinien basierend auf HTTP-Headern wie Cache-Control, Expires und ETag.
import Foundation
let cache = URLCache(
memoryCapacity: 50 * 1024 * 1024,
diskCapacity: 200 * 1024 * 1024,
diskPath: "network-cache"
)
URLCache.shared = cache
let config = URLSessionConfiguration.default
config.urlCache = cache
config.requestCachePolicy = .returnCacheDataElseLoad
let session = URLSession(configuration: config)
URLCache-Caching-Richtlinien bestimmen, wann zwischengespeicherte Daten verwendet und wann eine neue Anfrage durchgeführt wird. Zu den wichtigsten Richtlinien gehören: useProtocolCachePolicy (basierend auf Server-Headern), reloadIgnoringLocalCacheData (immer vom Server), returnCacheDataElseLoad (zuerst Cache), returnCacheDataDontLoad (nur Cache — Offline-Modus).
Cache-Control ist ein HTTP-Header, den der Server zusammen mit der Antwort sendet und der max-age (Lebensdauer in Sekunden), must-revalidate (Aktualität prüfen), no-cache (nicht ohne Überprüfung verwenden) und no-store (nicht zwischenspeichern) angibt. iOS beachtet diese Header bei Verwendung von URLCache mit der useProtocolCachePolicy-Richtlinie automatisch streng.
Benutzerdefiniertes Caching ist notwendig, wenn der integrierte URLCache nicht ausreicht — zum Speichern von verarbeiteten Bildern, serialisierten Datenmodellen oder Berechnungsergebnissen. In solchen Fällen erstellen Entwickler ihr eigenes Caching-System basierend auf dem Caches-Verzeichnis im Sandbox der App.
class DiskCache<T: Codable> {
private let cacheDir: URL
private let encoder = JSONEncoder()
private let decoder = JSONDecoder()
init() {
let paths = FileManager.default
.urls(for: .cachesDirectory,
in: .userDomainMask)
cacheDir = paths[0].appendingPathComponent(
"data-cache", isDirectory: true
)
try? FileManager.default
.createDirectory(at: cacheDir,
withIntermediateDirectories: true)
}
func set(value: T, for key: String) {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
if let data = try? encoder.encode(value) {
try? data.write(to: url)
}
}
func get(for key: String) -> T? {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
guard let data = try? Data(contentsOf: url) else { return nil }
return try? decoder.decode(T.self, from: data)
}
func clearAll() {
try? FileManager.default
.removeItem(at: cacheDir)
}
}
Cache-Invalidierungsstrategien bestimmen, wann gespeicherte Daten als veraltet gelten: TTL (Time-To-Live) — Daten leben eine festgelegte Zeit nach dem Schreiben; ereignisgesteuert — Invalidierung basierend auf einem Ereignis (z. B. Datenaktualisierung auf dem Server); versionsbasiert — Invalidierung bei Änderung der API-Version oder des Datenformats; LRU (Least Recently Used) — automatische Entfernung der am wenigsten genutzten Einträge bei Überschreitung des Größenlimits.
Praktische Regel: TTL eignet sich für Nachrichten und Inhalte, die vorhersagbar veralten. Ereignisgesteuert für serververwaltete Daten per Push-Benachrichtigungen. Versionsbasiert für Konfigurationen und Datenmodell-Caches. LRU ist eine universelle Wahl für Mediendateien mit begrenztem Speicherplatz.
Die Leistung von Disk Cache wird anhand der Trefferquote gemessen — dem Prozentsatz der Anfragen, die ohne Netzwerkaufruf aus dem Cache bedient werden. Eine typische Trefferquote für einen gut konfigurierten Bild-Cache beträgt 70–90%, für API-Antworten 40–60%, für Streaming-Video 30–50%.
| Datentyp | Typische Trefferquote | Empfohlene Cache-Größe |
|---|---|---|
| Bilder | 70–90% | 100–500 MB |
| API-JSON-Antworten | 40–60% | 10–50 MB |
| Video/Audio | 30–50% | 500 MB — 1 GB |
| Schriftarten und Ressourcen | 90–99% | 5–20 MB |
| Web-Inhalte | 50–70% | 50–200 MB |
Einschränkungen von Disk Cache in iOS: Das System kann den Inhalt des Caches-Verzeichnisses jederzeit löschen, wenn der Speicherplatz knapp wird. Dieses Verhalten ist nicht konfigurierbar — iOS entscheidet, wann und welche zwischengespeicherten Dateien gelöscht werden. Daher darf der Cache keine Daten enthalten, die nicht aus dem Netzwerk oder anderen Quellen wiederhergestellt werden können.
Auswirkungen auf den Flash-Speicher: Häufiges Schreiben in den Disk Cache beschleunigt den Verschleiß des Flash-Speichers. iOS verwendet TRIM und Wear Leveling, um den Verschleiß zu minimieren, aber Entwicklern wird empfohlen, übermäßiges Schreiben zu vermeiden: Aktualisieren Sie den Cache für dieselbe Datei nicht öfter als einmal alle 5 Minuten; fassen Sie kleine Schreibvorgänge zusammen; verwenden Sie NSCache für temporäre Daten, die nicht auf dem Datenträger gespeichert werden müssen.
Zweistufiger Cache ist die Standardarchitektur für iOS-Apps: Arbeitsspeicher (NSCache) für häufig aufgerufene Daten und Datenträger (URLCache oder benutzerdefiniert) für Daten, die zwischen Sitzungen erhalten bleiben sollen. Lebensdauer im Arbeitsspeicher — Minuten, auf dem Datenträger — Stunden oder Tage.
Bild-Caching: Verwenden Sie spezialisierte Bibliotheken (Kingfisher, SDWebImage, Nuke), die einen zweistufigen Cache mit automatischer Invalidierung, Speicherverwaltung und asynchronem Schreiben auf den Datenträger implementieren. Die Implementierung eines benutzerdefinierten Bild-Caches erfordert die Berücksichtigung von Dekodierung, Farbraum und Skalierung.
Cache und Sicherheit: Speichern Sie vertrauliche Daten (Passwörter, Token, persönliche Daten) nicht ohne Verschlüsselung auf dem Datenträger zwischen. URLCache verschlüsselt Daten standardmäßig nicht — verwenden Sie NSFileProtection oder anwendungsebene Verschlüsselung für sensible Inhalte. Für autorisierte Netzwerkanfragen verwenden Sie die Richtlinie .reloadIgnoringLocalCacheData.
Cache-Überwachung: Verfolgen Sie die Trefferquote, die aktuelle Cache-Größe und die Schreibvorgänge pro Minute. Wenn die Trefferquote unter 30% fällt, ist der Cache ineffizient und erfordert eine Strategieüberprüfung oder Größenerhöhung. Laut Point-Free (2024) ist die Cache-Überwachung eine der am meisten unterschätzten Optimierungspraktiken für die Leistung von iOS-Apps.
Häufig gestellte Fragen
Disk Cache ist eine Technologie zum Speichern von Daten auf dem Datenträger des Geräts, um wiederholte Zugriffe zu beschleunigen. Der integrierte URLCache von iOS speichert HTTP-Antworten zwischen, und Entwickler können benutzerdefinierte Caches über das Caches-Verzeichnis erstellen.
RAM Cache (NSCache) speichert Daten im Arbeitsspeicher — schneller, geht aber beim Neustart der App verloren. Disk Cache ist langsamer, bleibt aber zwischen Sitzungen erhalten. Die optimale Strategie verwendet beide Ebenen: Arbeitsspeicher für heiße Daten, Datenträger für kalte Daten.
Ja, das System kann den Inhalt des Caches-Verzeichnisses jederzeit löschen, wenn der Speicherplatz knapp wird. Speichern Sie daher niemals unwiederherstellbare Daten im Cache. Verwenden Sie das Documents-Verzeichnis für Benutzerdokumente.
Die Cache-Größe hängt vom Datentyp ab: 100–500 MB für Bilder, 10–50 MB für API-Antworten, bis zu 1 GB für Videos. Überwachen Sie die Trefferquote — wenn sie unter 50% fällt, erhöhen Sie die Cache-Größe oder ändern Sie die Invalidierungsstrategie.
URLCache.removeAllCachedResponses() löscht den integrierten Cache. Für benutzerdefinierte Caches löschen Sie Dateien aus dem Caches-Verzeichnis über FileManager. Geben Sie Benutzern immer die Möglichkeit, den Cache über die App-Einstellungen zu löschen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch