Disk Cache — är en mekanism för tillfällig lagring av data på enhetens disk, som gör det möjligt för iOS-appar att snabba upp återkommande åtkomst till tidigare laddade resurser. Enligt Apple Developer Documentation, 2024 minskar Disk Cache nätverksanvändningen, minskar belastningen på batteriet och säkerställer att appen fungerar i offline-läge. iOS tillhandahåller flera inbyggda cachningsmekanismer: URLCache för nätverksförfrågningar, NSCache för RAM-minne och anpassade implementeringar via Caches-katalogen.
Huvudpunkter
Disk Cache — är en teknik för tillfällig lagring av data på enhetens permanenta lagringsmedium (flashminne) för att påskynda efterföljande förfrågningar till samma data. Till skillnad från RAM-cache bevarar Disk Cache data efter omstart av appen och även enheten.
iOS erbjuder två huvudsakliga cachningsnivåer: operativ (NSCache, minne) och disk (URLCache, filsystem). Disk-cache är 10–100 gånger långsammare än operativ cache, men betydligt snabbare än en nätverksförfrågan — skillnaden kan vara 2 till 3 storleksordningar. Den optimala strategin använder en två-nivåers cache: minne för het data och disk för kall data.
Enligt Apple Performance Optimization Guide, 2023 minskar en korrekt konfigurerad Disk Cache laddningstiden för innehåll med 60–80% för återkommande visningar och minskar trafikförbrukningen med 40–70%. För appar med mediainnehåll (bilder, video, ljud) är cachning en kritisk UX-faktor.
URLCache — är en inbyggd Foundation-klass som implementerar en kombinerad cache för URLSession-förfrågningar. Den sparar automatiskt serversvar på disk och i minne, och hanterar cache-storlek och ogiltigförklaringspolicyer baserat på HTTP-rubrikerna Cache-Control, Expires och 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)
Cachningspolicyer URLCache bestämmer när cachad data ska användas och när en ny förfrågan ska göras. Huvudsakliga policyer: useProtocolCachePolicy (baserat på serverrubriker), reloadIgnoringLocalCacheData (alltid från servern), returnCacheDataElseLoad (först cachen), returnCacheDataDontLoad (endast cache — offline-läge).
Cache-Control — HTTP-rubrik som servern skickar tillsammans med svaret, som anger max-age (livslängd i sekunder), must-revalidate (kontrollera aktualitet), no-cache (använd inte utan verifiering) och no-store (cacha inte). iOS följer strikt dessa rubriker automatiskt när URLCache används med policyn useProtocolCachePolicy.
Anpassad cache är nödvändig när den inbyggda URLCache inte räcker till: för lagring av bearbetade bilder, serialiserade datamodeller eller beräkningsresultat. I sådana fall skapar utvecklaren sitt eget cachningssystem baserat på Caches-katalogen i appens Sandbox.
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)
}
}
Ogiltigförklaringsstrategier för cache bestämmer när lagrad data anses föråldrad: TTL (Time-To-Live) — data lever en fast tid efter skrivning; event-driven — ogiltigförklaring vid en händelse (t.ex. datauppdatering på servern); version-based — ogiltigförklaring vid ändring av API-version eller dataformat; LRU (Least Recently Used) — automatisk borttagning av minst använda poster när storleksgränsen överskrids.
Praktisk regel: TTL är lämplig för nyheter och innehåll som blir föråldrat på ett förutsägbart sätt. Event-driven — för data som hanteras av servern via push-notiser. Version-based — för konfigurationer och datamodell-cache. LRU — universellt val för mediafiler med begränsat diskutrymme.
Prestanda för Disk Cache mäts med hit ratio — andelen förfrågningar som besvaras från cachen utan nätverksåtkomst. Typisk hit ratio för en välkonfigurerad bildcache är 70–90%, för API-svar — 40–60%, för strömmande video — 30–50%.
| Datatyp | Typisk hit ratio | Rekommenderad cache-storlek |
|---|---|---|
| Bilder | 70–90% | 100–500 MB |
| API JSON-svar | 40–60% | 10–50 MB |
| Video/ljud | 30–50% | 500 MB — 1 GB |
| Typsnitt och resurser | 90–99% | 5–20 MB |
| Webbinnehåll | 50–70% | 50–200 MB |
Begränsningar för Disk Cache i iOS: systemet kan när som helst ta bort innehållet i Caches-katalogen vid brist på diskutrymme. Detta beteende går inte att konfigurera — iOS bestämmer själv när och vilka cache-filer som ska tas bort. Därför bör cachen inte innehålla data som inte kan återställas från nätverket eller andra källor.
Påverkan på flashminne: frekvent skrivning till Disk Cache påskyndar slitage på flashminnet. iOS använder TRIM och wear leveling för att minimera slitaget, men utvecklare rekommenderas att undvika överdriven skrivning: uppdatera inte cachen oftare än en gång var 5:e minut för samma fil; gruppera små skrivningar till en; använd NSCache för tillfällig data som inte behöver lagras på disk.
Två-nivåers cache — standardarkitektur för iOS-appar: minne (NSCache) för data som ofta nås och disk (URLCache eller anpassad) för data som ska bevaras mellan sessioner. Livslängd i minnet — minuter, på disk — timmar eller dagar.
Cachning av bilder: använd specialiserade bibliotek (Kingfisher, SDWebImage, Nuke) som implementerar två-nivåers cache med automatisk ogiltigförklaring, minneshantering och asynkron skrivning till disk. Egen implementering av bildcache kräver hänsyn till avkodning, färgrymd och skalning.
Cache och säkerhet: cacha inte konfidentiell data (lösenord, tokens, personuppgifter) på disk utan kryptering. URLCache krypterar inte data som standard — använd NSFileProtection eller kryptering på applikationsnivå för känsligt innehåll. För nätverksförfrågningar med autentisering, använd policyn .reloadIgnoringLocalCacheData.
Cache-övervakning: övervaka hit ratio, aktuell cache-storlek och antal skrivningar per minut. Om hit ratio sjunker under 30% — är cachen ineffektiv och kräver översyn av strategin eller ökning av storleken. Enligt Point-Free (2024) är cache-övervakning en av de mest underskattade praxis för prestandaoptimering av iOS-appar.
Vanliga frågor
Disk Cache — teknik för lagring av data på enhetens disk för att snabba upp återkommande åtkomst. I iOS cachar den inbyggda URLCache HTTP-svar, och utvecklare kan skapa anpassade cachar via Caches-katalogen.
RAM Cache (NSCache) lagrar data i RAM-minnet — snabbare, men försvinner vid omstart av appen. Disk Cache är långsammare, men bevaras mellan sessioner. Den optimala strategin använder båda nivåerna: minne för het data, disk för kall data.
Ja, systemet kan när som helst ta bort innehållet i Caches-katalogen vid brist på utrymme. Förvara därför aldrig data i cachen som inte kan återställas. För användardokument, använd Documents-katalogen.
Cache-storleken beror på datatypen: för bilder 100–500 MB, för API-svar 10–50 MB, för video upp till 1 GB. Övervaka hit ratio — om den sjunker under 50%, öka cache-storleken eller ändra ogiltigförklaringsstrategin.
URLCache.removeAllCachedResponses() rensar den inbyggda cachen. För anpassad cache, ta bort filer från Caches-katalogen via FileManager. Ge alltid användaren möjlighet att rensa cachen i appens inställningar.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också