Disk Cache — je mechanismus dočasného ukládání dat na disk zařízení, který umožňuje aplikacím iOS urychlit opakovaný přístup k dříve načteným zdrojům. Podle Apple Developer Documentation, 2024 Disk Cache snižuje využití sítě, snižuje zatížení baterie a zajišťuje provoz aplikace v offline režimu. iOS poskytuje několik vestavěných mechanismů ukládání do mezipaměti: URLCache pro síťové požadavky, NSCache pro operační paměť a vlastní implementace prostřednictvím adresáře Caches.
Hlavní body
Disk Cache — je technologie dočasného ukládání dat na trvalé úložiště zařízení (flash paměť) za účelem urychlení následných požadavků na stejná data. Na rozdíl od mezipaměti RAM si Disk Cache uchovává data po restartu aplikace a dokonce i zařízení.
iOS poskytuje dvě hlavní úrovně ukládání do mezipaměti: operační (NSCache, paměť) a diskovou (URLCache, souborový systém). Disková mezipaměť je 10–100krát pomalejší než operační, ale výrazně rychlejší než síťový požadavek — rozdíl může být 2 až 3 řády. Optimální strategie využívá dvouúrovňovou mezipaměť: paměť pro horká data a disk pro studená data.
Podle Apple Performance Optimization Guide, 2023 správně nakonfigurovaná Disk Cache zkracuje dobu načítání obsahu o 60–80% pro opakovaná zobrazení a snižuje spotřebu provozu o 40–70%. Pro aplikace s multimediálním obsahem (obrázky, video, audio) je ukládání do mezipaměti kritickým faktorem UX.
URLCache — je vestavěná třída Foundation, která implementuje kombinovanou mezipaměť pro požadavky URLSession. Automaticky ukládá odpovědi serveru na disk a do paměti, spravuje velikost mezipaměti a politiky invalidace na základě HTTP hlaviček Cache-Control, Expires a 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)
Politiky ukládání do mezipaměti URLCache určují, kdy použít data z mezipaměti a kdy provést nový požadavek. Hlavní politiky: useProtocolCachePolicy (podle hlaviček serveru), reloadIgnoringLocalCacheData (vždy ze serveru), returnCacheDataElseLoad (nejprve mezipaměť), returnCacheDataDontLoad (pouze mezipaměť — offline režim).
Cache-Control — HTTP hlavička, kterou server odesílá spolu s odpovědí, udávající max-age (životnost v sekundách), must-revalidate (kontrola aktuálnosti), no-cache (nepoužívat bez ověření) a no-store (neukládat do mezipaměti). iOS tato hlavičky striktně dodržuje automaticky při použití URLCache s politikou useProtocolCachePolicy.
Vlastní mezipaměť je nezbytná, když vestavěný URLCache nestačí: pro ukládání zpracovaných obrázků, serializovaných datových modelů nebo výsledků výpočtů. V takových případech vývojář vytváří vlastní systém ukládání do mezipaměti založený na adresáři Caches v Sandboxu aplikace.
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)
}
}
Strategie invalidace mezipaměti určují, kdy jsou uložená data považována za zastaralá: TTL (Time-To-Live) — data žijí pevně stanovenou dobu po zápisu; event-driven — invalidace po výskytu události (např. aktualizace dat na serveru); version-based — invalidace při změně verze API nebo formátu dat; LRU (Least Recently Used) — automatické odstranění nejméně používaných záznamů při překročení limitu velikosti.
Praktické pravidlo: TTL je vhodné pro zprávy a obsah, který zastarává předvídatelným způsobem. Event-driven — pro data spravovaná serverem prostřednictvím push oznámení. Version-based — pro konfigurace a mezipaměť datových modelů. LRU — univerzální volba pro multimediální soubory s omezeným místem na disku.
Výkon Disk Cache se měří pomocí hit ratio — procento požadavků obsloužených z mezipaměti bez přístupu k síti. Typické hit ratio pro dobře nakonfigurovanou mezipaměť obrázků je 70–90%, pro odpovědi API — 40–60%, pro streamované video — 30–50%.
| Typ dat | Typické hit ratio | Doporučená velikost mezipaměti |
|---|---|---|
| Obrázky | 70–90% | 100–500 MB |
| Odpovědi API JSON | 40–60% | 10–50 MB |
| Video/audio | 30–50% | 500 MB — 1 GB |
| Písma a zdroje | 90–99% | 5–20 MB |
| Webový obsah | 50–70% | 50–200 MB |
Omezení Disk Cache v iOS: systém může kdykoli odstranit obsah adresáře Caches při nedostatku místa na disku. Toto chování nelze konfigurovat — iOS sám rozhoduje, kdy a které soubory mezipaměti odstranit. Proto by mezipaměť neměla obsahovat data, která nelze obnovit ze sítě nebo jiných zdrojů.
Dopad na flash paměť: častý zápis do Disk Cache urychluje opotřebení flash paměti. iOS používá TRIM a wear leveling pro minimalizaci opotřebení, ale vývojářům se doporučuje vyhnout se nadměrnému zápisu: neaktualizovat mezipaměť častěji než jednou za 5 minut pro stejný soubor; seskupovat malé zápisy do jednoho; používat NSCache pro dočasná data, která není nutné ukládat na disk.
Dvouúrovňová mezipaměť — standardní architektura pro iOS aplikace: paměť (NSCache) pro často přistupovaná data a disk (URLCache nebo vlastní) pro data, která by měla být zachována mezi relacemi. Životnost v paměti — minuty, na disku — hodiny nebo dny.
Ukládání obrázků do mezipaměti: používejte specializované knihovny (Kingfisher, SDWebImage, Nuke), které implementují dvouúrovňovou mezipaměť s automatickou invalidací, správou paměti a asynchronním zápisem na disk. Vlastní implementace mezipaměti obrázků vyžaduje zohlednění dekódování, barevného prostoru a škálování.
Mezipaměť a zabezpečení: neukládejte důvěrná data (hesla, tokeny, osobní údaje) na disk bez šifrování. URLCache ve výchozím nastavení data nešifruje — používejte NSFileProtection nebo šifrování na úrovni aplikace pro citlivý obsah. Pro síťové požadavky s autorizací používejte politiku .reloadIgnoringLocalCacheData.
Sledování mezipaměti: sledujte hit ratio, aktuální velikost mezipaměti a počet zápisů za minutu. Pokud hit ratio klesne pod 30% — mezipaměť je neefektivní a vyžaduje revizi strategie nebo zvětšení velikosti. Podle Point-Free (2024) je sledování mezipaměti jednou z nejvíce podceňovaných praktik optimalizace výkonu iOS aplikací.
Často kladené otázky
Disk Cache — technologie ukládání dat na disk zařízení pro urychlení opakovaného přístupu. V iOS vestavěný URLCache ukládá HTTP odpovědi do mezipaměti a vývojáři mohou vytvářet vlastní mezipaměti prostřednictvím adresáře Caches.
RAM Cache (NSCache) ukládá data do operační paměti — je rychlejší, ale ztrácí se při restartu aplikace. Disk Cache je pomalejší, ale uchovává se mezi relacemi. Optimální strategie využívá obě úrovně: paměť pro horká data, disk pro studená data.
Ano, systém může kdykoli odstranit obsah adresáře Caches při nedostatku místa. Proto nikdy neukládejte do mezipaměti data, která nelze obnovit. Pro uživatelské dokumenty používejte adresář Documents.
Velikost mezipaměti závisí na typu dat: pro obrázky 100–500 MB, pro odpovědi API 10–50 MB, pro video až 1 GB. Sledujte hit ratio — pokud klesne pod 50%, zvětšete velikost mezipaměti nebo změňte strategii invalidace.
URLCache.removeAllCachedResponses() vyčistí vestavěnou mezipaměť. Pro vlastní mezipaměť odstraňte soubory z adresáře Caches pomocí FileManager. Vždy poskytněte uživateli možnost vyčistit mezipaměť v nastavení aplikace.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také