Disk Cache — to mechanizm tymczasowego przechowywania danych na dysku urządzenia, umożliwiający aplikacjom iOS przyspieszenie ponownego dostępu do wcześniej załadowanych zasobów. Według Apple Developer Documentation, 2024, Disk Cache zmniejsza wykorzystanie sieci, obniża obciążenie baterii i zapewnia działanie aplikacji w trybie offline. iOS udostępnia kilka wbudowanych mechanizmów buforowania: URLCache dla zapytań sieciowych, NSCache dla pamięci operacyjnej oraz niestandardowe implementacje poprzez katalog Caches.
Najważniejsze
Disk Cache — to technologia tymczasowego przechowywania danych na stałym nośniku urządzenia (pamięci flash) w celu przyspieszenia kolejnych zapytań do tych samych danych. W przeciwieństwie do pamięci RAM, Disk Cache zachowuje dane po ponownym uruchomieniu aplikacji, a nawet urządzenia.
iOS udostępnia dwa główne poziomy buforowania: operacyjny (NSCache, pamięć) i dyskowy (URLCache, system plików). Buforowanie dyskowe jest 10–100 razy wolniejsze niż operacyjne, ale znacznie szybsze niż zapytanie sieciowe — różnica może wynosić od 2 do 3 rzędów wielkości. Optymalna strategia wykorzystuje dwupoziomową pamięć podręczną: pamięć dla gorących danych i dysk dla zimnych.
Według Apple Performance Optimization Guide, 2023, prawidłowo skonfigurowany Disk Cache skraca czas ładowania treści o 60–80% przy powtórnych przeglądaniach i zmniejsza zużycie transferu o 40–70%. W przypadku aplikacji z treściami multimedialnymi (obrazy, wideo, audio) buforowanie jest krytycznym czynnikiem UX.
URLCache — to wbudowana klasa Foundation implementująca połączoną pamięć podręczną dla zapytań URLSession. Automatycznie zapisuje odpowiedzi serwera na dysku i w pamięci, zarządzając rozmiarem cache i politykami unieważniania na podstawie nagłówków HTTP Cache-Control, Expires i 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)
Polityki buforowania URLCache określają, kiedy używać danych z pamięci podręcznej, a kiedy wykonać nowe zapytanie. Główne polityki: useProtocolCachePolicy (na podstawie nagłówków serwera), reloadIgnoringLocalCacheData (zawsze z serwera), returnCacheDataElseLoad (najpierw cache), returnCacheDataDontLoad (tylko cache — tryb offline).
Cache-Control — nagłówek HTTP, który serwer wysyła wraz z odpowiedzią, wskazując max-age (czas życia w sekundach), must-revalidate (sprawdzanie aktualności), no-cache (nie używaj bez weryfikacji) i no-store (nie buforuj). iOS ściśle przestrzega tych nagłówków automatycznie przy użyciu URLCache z polityką useProtocolCachePolicy.
Niestandardowa pamięć podręczna jest konieczna, gdy wbudowany URLCache nie wystarcza: do przechowywania przetworzonych obrazów, serializowanych modeli danych lub wyników obliczeń. W takich przypadkach programista tworzy własny system buforowania oparty na katalogu Caches w Sandbox aplikacji.
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 unieważniania cache określają, kiedy przechowywane dane są uznawane za nieaktualne: TTL (Time-To-Live) — dane żyją przez ustalony czas po zapisie; event-driven — unieważnienie po wystąpieniu zdarzenia (np. aktualizacja danych na serwerze); version-based — unieważnienie przy zmianie wersji API lub formatu danych; LRU (Least Recently Used) — automatyczne usuwanie najmniej używanych zapisów po przekroczeniu limitu rozmiaru.
Praktyczna zasada: TTL jest odpowiedni dla wiadomości i treści, które starzeją się w przewidywalny sposób. Event-driven — dla danych zarządzanych przez serwer poprzez powiadomienia push. Version-based — dla konfiguracji i modeli danych. LRU — uniwersalny wybór dla plików multimedialnych z ograniczoną przestrzenią dyskową.
Wydajność Disk Cache mierzy się za pomocą hit ratio — procent zapytań obsłużonych z cache bez odwołania do sieci. Typowy hit ratio dla dobrze skonfigurowanego cache obrazów wynosi 70–90%, dla odpowiedzi API — 40–60%, dla strumieniowego wideo — 30–50%.
| Typ danych | Typowy hit ratio | Zalecany rozmiar cache |
|---|---|---|
| Obrazy | 70–90% | 100–500 MB |
| Odpowiedzi API JSON | 40–60% | 10–50 MB |
| Wideo/audio | 30–50% | 500 MB — 1 GB |
| Czcionki i zasoby | 90–99% | 5–20 MB |
| Treści web | 50–70% | 50–200 MB |
Ograniczenia Disk Cache w iOS: system może usunąć zawartość katalogu Caches w dowolnym momencie przy braku miejsca na dysku. To zachowanie nie jest konfigurowalne — iOS sam decyduje, kiedy i które pliki cache usunąć. Dlatego cache nie powinien zawierać danych, których nie można odzyskać z sieci lub innych źródeł.
Wpływ na pamięć flash: częsty zapis do Disk Cache przyspiesza zużycie pamięci flash. iOS używa TRIM i wear leveling w celu minimalizacji zużycia, ale programistom zaleca się unikanie nadmiernego zapisu: nie aktualizować cache częściej niż raz na 5 minut dla tego samego pliku; grupować małe zapisy w jeden; używać NSCache dla danych tymczasowych, które nie wymagają przechowywania na dysku.
Dwupoziomowa pamięć podręczna — standardowa architektura dla aplikacji iOS: pamięć (NSCache) dla danych, do których często się odwołujemy, i dysk (URLCache lub niestandardowy) dla danych, które powinny być zachowane między sesjami. Czas życia w pamięci — minuty, na dysku — godziny lub dni.
Buforowanie obrazów: używaj wyspecjalizowanych bibliotek (Kingfisher, SDWebImage, Nuke), które implementują dwupoziomową pamięć podręczną z automatycznym unieważnianiem, obsługą pamięci i asynchronicznym zapisem na dysk. Samodzielna implementacja cache obrazów wymaga uwzględnienia dekodowania, przestrzeni kolorów i skalowania.
Cache i bezpieczeństwo: nie buforuj poufnych danych (haseł, tokenów, danych osobowych) na dysku bez szyfrowania. URLCache domyślnie nie szyfruje danych — używaj NSFileProtection lub szyfrowania na poziomie aplikacji dla wrażliwych treści. Dla zapytań sieciowych z autoryzacją używaj polityki .reloadIgnoringLocalCacheData.
Monitorowanie cache: śledź hit ratio, bieżący rozmiar cache i liczbę zapisów na minutę. Jeśli hit ratio spada poniżej 30% — cache jest nieefektywny i wymaga przeglądu strategii lub zwiększenia rozmiaru. Według Point-Free (2024), monitorowanie cache jest jedną z najbardziej niedocenianych praktyk optymalizacji wydajności aplikacji iOS.
Często zadawane pytania
Disk Cache — technologia przechowywania danych na dysku urządzenia w celu przyspieszenia ponownego dostępu. W iOS wbudowany URLCache buforuje odpowiedzi HTTP, a programiści mogą tworzyć niestandardowe cache poprzez katalog Caches.
RAM Cache (NSCache) przechowuje dane w pamięci operacyjnej — jest szybszy, ale ginie przy ponownym uruchomieniu aplikacji. Disk Cache jest wolniejszy, ale zachowuje dane między sesjami. Optymalna strategia wykorzystuje oba poziomy: pamięć dla gorących danych, dysk dla zimnych.
Tak, system może usunąć zawartość katalogu Caches w dowolnym momencie przy braku miejsca. Dlatego nigdy nie przechowuj w cache danych, których nie można odzyskać. Dla dokumentów użytkownika używaj katalogu Documents.
Rozmiar cache zależy od typu danych: dla obrazów 100–500 MB, dla odpowiedzi API 10–50 MB, dla wideo do 1 GB. Śledź hit ratio — jeśli spada poniżej 50%, zwiększ rozmiar cache lub zmień strategię unieważniania.
URLCache.removeAllCachedResponses() czyści wbudowany cache. Dla niestandardowego cache usuń pliki z katalogu Caches przez FileManager. Zawsze zapewniaj użytkownikowi możliwość wyczyszczenia cache w ustawieniach aplikacji.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również