Disk Cache, cihazın diskinde verileri geçici olarak depolayan bir mekanizmadır ve iOS uygulamalarının önceden yüklenmiş kaynaklara tekrar tekrar erişimini hızlandırır. Apple Developer Documentation, 2024'e göre, Disk Cache ağ kullanımını azaltır, pil yükünü düşürür ve uygulamanın çevrimdışı modda çalışmasını sağlar. iOS, birkaç yerleşik önbellek mekanizması sunar: ağ istekleri için URLCache, RAM için NSCache ve Caches dizini aracılığıyla özel uygulamalar.
Ana Noktalar
Disk Cache, aynı verilere yapılan sonraki istekleri hızlandırmak için cihazın kalıcı depolama alanında (flash bellek) verileri geçici olarak depolayan bir teknolojidir. RAM önbelleğinin aksine, Disk Cache uygulama ve hatta cihaz yeniden başlatıldıktan sonra bile verileri korur.
iOS iki ana önbellek düzeyi sağlar: uçucu (NSCache, bellek) ve disk tabanlı (URLCache, dosya sistemi). Disk önbelleği, uçucu önbellekten 10–100 kat daha yavaştır ancak bir ağ isteğinden önemli ölçüde daha hızlıdır — fark 2 ila 3 büyüklük mertebesinde olabilir. En uygun strateji, iki düzeyli bir önbellek kullanır: sıcak veriler için bellek, soğuk veriler için disk.
Apple Performance Optimization Guide, 2023'e göre, doğru yapılandırılmış bir Disk Cache, tekrar görüntülemelerde içerik yükleme süresini %60–80 oranında azaltır ve trafik tüketimini %40–70 oranında düşürür. Medya açısından zengin uygulamalar (görseller, video, ses) için önbellek önemli bir UX faktörüdür.
URLCache, URLSession istekleri için birleşik bir önbellek uygulayan yerleşik bir Foundation sınıfıdır. Cache-Control, Expires ve ETag gibi HTTP başlıklarına dayalı olarak önbellek boyutunu ve geçersiz kılma politikalarını yöneterek sunucu yanıtlarını otomatik olarak diske ve belleğe kaydeder.
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 önbellek politikaları, önbelleğe alınmış verilerin ne zaman kullanılacağını ve ne zaman yeni bir istek yapılacağını belirler. Ana politikalar şunları içerir: useProtocolCachePolicy (sunucu başlıklarına dayalı), reloadIgnoringLocalCacheData (her zaman sunucudan), returnCacheDataElseLoad (önce önbellek), returnCacheDataDontLoad (yalnızca önbellek — çevrimdışı mod).
Cache-Control, sunucunun yanıtla birlikte gönderdiği bir HTTP başlığıdır ve max-age (saniye cinsinden ömür), must-revalidate (güncelliği kontrol et), no-cache (doğrulama olmadan kullanma) ve no-store (önbelleğe alma) belirtir. iOS, useProtocolCachePolicy politikasıyla URLCache kullanırken bu başlıklara otomatik olarak sıkı bir şekilde uyar.
Özel önbellek, yerleşik URLCache yetersiz olduğunda gereklidir — işlenmiş görselleri, serileştirilmiş veri modellerini veya hesaplama sonuçlarını depolamak için. Bu gibi durumlarda, geliştiriciler uygulamanın Sandbox'undaki Caches dizinine dayalı olarak kendi önbellek sistemlerini oluştururlar.
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)
}
}
Önbellek geçersiz kılma stratejileri, depolanan verilerin ne zaman güncelliğini yitirdiğini belirler: TTL (Time-To-Live) — veriler yazıldıktan sonra sabit bir süre yaşar; olay odaklı — bir olaya dayalı geçersiz kılma (örn. sunucuda veri güncellemesi); sürüm tabanlı — API sürümü veya veri formatı değiştiğinde geçersiz kılma; LRU (Least Recently Used) — boyut sınırı aşıldığında en az kullanılan girişlerin otomatik olarak kaldırılması.
Pratik kural: TTL, tahmin edilebilir şekilde güncelliğini yitiren haberler ve içerikler için uygundur. Olay odaklı, push bildirimleri aracılığıyla sunucu tarafından yönetilen veriler içindir. Sürüm tabanlı, yapılandırmalar ve veri modeli önbellekleri içindir. LRU, sınırlı disk alanına sahip medya dosyaları için evrensel bir seçimdir.
Disk Cache performansı, isabet oranı (hit ratio) ile ölçülür — ağ çağrısı olmadan önbellekten karşılanan isteklerin yüzdesi. İyi yapılandırılmış bir görsel önbelleği için tipik isabet oranı %70–90, API yanıtları için %40–60, akış videosu için %30–50'dir.
| Veri Türü | Tipik İsabet Oranı | Önerilen Önbellek Boyutu |
|---|---|---|
| Görseller | %70–90 | 100–500 MB |
| API JSON yanıtları | %40–60 | 10–50 MB |
| Video/Ses | %30–50 | 500 MB — 1 GB |
| Yazı tipleri ve kaynaklar | %90–99 | 5–20 MB |
| Web içeriği | %50–70 | 50–200 MB |
iOS'ta Disk Cache sınırlamaları: sistem, disk alanı yetersiz olduğunda Caches dizininin içeriğini herhangi bir zamanda silebilir. Bu davranış yapılandırılamaz — iOS, önbellek dosyalarının ne zaman ve hangilerinin silineceğine karar verir. Bu nedenle, önbellek, ağdan veya diğer kaynaklardan kurtarılamayan verileri içermemelidir.
Flash belleğe etkisi: Disk Cache'e sık yazma, flash depolamanın aşınmasını hızlandırır. iOS, aşınmayı en aza indirmek için TRIM ve wear leveling kullanır, ancak geliştiricilerin aşırı yazmalardan kaçınmaları önerilir: aynı dosya için önbelleği 5 dakikada bir defadan fazla güncellemeyin; küçük yazmaları bir araya toplayın; diskte saklanması gerekmeyen geçici veriler için NSCache kullanın.
İki düzeyli önbellek, iOS uygulamaları için standart mimaridir: sık erişilen veriler için bellek (NSCache) ve oturumlar arasında kalıcı olması gereken veriler için disk (URLCache veya özel). Bellekte ömür — dakika, diskte — saatler veya günler.
Görsel önbelleğime: otomatik geçersiz kılma, bellek yönetimi ve eşzamansız disk yazma ile iki düzeyli önbellek uygulayan özel kitaplıklar (Kingfisher, SDWebImage, Nuke) kullanın. Özel bir görsel önbelleği uygulamak, kod çözme, renk alanı ve ölçeklendirmenin dikkate alınmasını gerektirir.
Önbellek ve güvenlik: hassas verileri (şifreler, token'lar, kişisel veriler) şifreleme olmadan diskte önbelleğe almayın. URLCache, varsayılan olarak verileri şifrelemez — hassas içerik için NSFileProtection veya uygulama düzeyinde şifreleme kullanın. Yetkilendirilmiş ağ istekleri için .reloadIgnoringLocalCacheData politikasını kullanın.
Önbellek izleme: isabet oranını, geçerli önbellek boyutunu ve dakika başına yazma sayısını izleyin. İsabet oranı %30'un altına düşersee, önbellek verimsizdir ve strateji gözden geçirmesi veya boyut artışı gerektirir. Point-Free (2024)'e göre, önbellek izleme, iOS uygulama performansı optimizasyonunun en hafife alınan uygulamalarından biridir.
Sıkça Sorulan Sorular
Disk Cache, tekrar erişimi hızlandırmak için cihazın diskinde veri depolayan bir teknolojidir. iOS'un yerleşik URLCache'i HTTP yanıtlarını önbelleğe alır ve geliştiriciler Caches dizini aracılığıyla özel önbellekler oluşturabilir.
RAM Cache (NSCache) verileri RAM'de depolar — daha hızlıdır ancak uygulama yeniden başlatıldığında kaybolur. Disk Cache daha yavaştır ancak oturumlar arasında kalıcıdır. En uygun strateji her iki düzeyi de kullanır: sıcak veriler için bellek, soğuk veriler için disk.
Evet, sistem disk alanı yetersiz olduğunda Caches dizininin içeriğini herhangi bir zamanda silebilir. Bu nedenle, önbellekte asla kurtarılamaz verileri depolamayın. Kullanıcı belgeleri için Documents dizinini kullanın.
Önbellek boyutu veri türüne bağlıdır: görseller için 100–500 MB, API yanıtları için 10–50 MB, video için 1 GB'a kadar. İsabet oranını izleyin — %50'nin altına düşerse, önbellek boyutunu artırın veya geçersiz kılma stratejisini değiştirin.
URLCache.removeAllCachedResponses() yerleşik önbelleği temizler. Özel önbellek için, FileManager aracılığıyla Caches dizinindeki dosyaları silin. Kullanıcılara her zaman uygulama ayarları aracılığıyla önbelleği temizleme seçeneği sunun.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun