Disk Cache — مکانیزمی برای ذخیرهسازی موقت دادهها روی دیسک دستگاه است که به برنامههای iOS امکان میدهد دسترسی مجدد به منابع بارگذاریشده قبلی را تسریع کنند. به گفته Apple Developer Documentation, 2024, Disk Cache استفاده از شبکه را کاهش میدهد، بار باتری را کم میکند و عملکرد برنامه را در حالت آفلاین تضمین میکند. iOS چندین مکانیزم داخلی ذخیرهسازی نهان ارائه میدهد: URLCache برای درخواستهای شبکه، NSCache برای حافظه رم و پیادهسازیهای سفارشی از طریق دایرکتوری Caches.
نکات اصلی
Disk Cache — فناوری ذخیرهسازی موقت دادهها روی حافظه دائمی دستگاه (فلش) به منظور تسریع درخواستهای بعدی به همان دادهها است. برخلاف حافظه نهان RAM، Disk Cache دادهها را پس از راهاندازی مجدد برنامه و حتی دستگاه حفظ میکند.
iOS دو سطح اصلی ذخیرهسازی نهان ارائه میدهد: عملیاتی (NSCache، حافظه) و دیسکی (URLCache، سیستم فایل). حافظه نهان دیسکی 10–100 برابر کندتر از حافظه عملیاتی است، اما به طور قابل توجهی سریعتر از درخواست شبکه — تفاوت میتواند 2 تا 3 مرتبه بزرگی باشد. استراتژی بهینه از حافظه نهان دو سطحی استفاده میکند: حافظه برای دادههای داغ و دیسک برای دادههای سرد.
به گفته Apple Performance Optimization Guide, 2023, Disk Cache که به درستی پیکربندی شده باشد، زمان بارگذاری محتوا را در بازدیدهای مکرر 60–80% کاهش میدهد و مصرف ترافیک را 40–70% کم میکند. برای برنامههای دارای محتوای چندرسانهای (تصاویر، ویدئو، صدا)، ذخیرهسازی نهان یک عامل حیاتی برای تجربه کاربری است.
URLCache — یک کلاس داخلی Foundation است که حافظه نهان ترکیبی برای درخواستهای URLSession پیادهسازی میکند. این کلاس به طور خودکار پاسخهای سرور را روی دیسک و در حافظه ذخیره میکند و اندازه حافظه نهان و سیاستهای باطلسازی را بر اساس هدرهای HTTP Cache-Control، Expires و 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 تعیین میکنند که چه زمانی از دادههای حافظه نهان استفاده شود و چه زمانی درخواست جدید انجام گیرد. سیاستهای اصلی: useProtocolCachePolicy (بر اساس هدرهای سرور)، reloadIgnoringLocalCacheData (همیشه از سرور)، returnCacheDataElseLoad (ابتدا حافظه نهان)، returnCacheDataDontLoad (فقط حافظه نهان — حالت آفلاین).
Cache-Control — هدر HTTP که سرور همراه با پاسخ ارسال میکند و max-age (مدت زمان زندگی به ثانیه)، must-revalidate (بررسی بهروزرسانی)، no-cache (بدون تأیید استفاده نکن) و no-store (ذخیره نکن) را مشخص میکند. iOS با استفاده از URLCache با سیاست useProtocolCachePolicy به طور خودکار از این هدرها پیروی میکند.
حافظه نهان سفارشی زمانی ضروری است که URLCache داخلی کافی نباشد: برای ذخیره تصاویر پردازششده، مدلهای داده سریالشده یا نتایج محاسبات. در چنین مواردی، توسعهدهنده سیستم ذخیرهسازی نهان خود را بر اساس دایرکتوری Caches در 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)
}
}
استراتژیهای باطلسازی حافظه نهان تعیین میکنند که چه زمانی دادههای ذخیرهشده قدیمی محسوب میشوند: TTL (Time-To-Live) — دادهها مدت زمان ثابتی پس از نوشتن زنده میمانند؛ event-driven — باطلسازی با وقوع رویداد (مثلاً بهروزرسانی دادهها در سرور)؛ version-based — باطلسازی با تغییر نسخه API یا قالب داده؛ LRU (Least Recently Used) — حذف خودکار کماستفادهترین记录ها پس از exceed از حد اندازه.
قاعده عملی: TTL برای اخبار و محتوایی که بهطور قابل پیشبینی قدیمی میشوند مناسب است. Event-driven — برای دادههایی که توسط سرور از طریق اعلانهای push مدیریت میشوند. Version-based — برای پیکربندیها و حافظه نهان مدلهای داده. LRU — انتخاب جهانی برای فایلهای رسانهای با فضای دیسک محدود.
عملکرد Disk Cache با hit ratio اندازهگیری میشود — درصد درخواستهایی که از حافظه نهان بدون مراجعه به شبکه تأمین میشوند. hit ratio معمولی برای حافظه نهان تصاویر که به خوبی پیکربندی شده 70–90%، برای پاسخهای API 40–60%، برای ویدئوی جریانی 30–50% است.
| نوع داده | Hit ratio معمولی | اندازه پیشنهادی حافظه نهان |
|---|---|---|
| تصاویر | 70–90% | 100–500 مگابایت |
| پاسخهای API JSON | 40–60% | 10–50 مگابایت |
| ویدئو/صدا | 30–50% | 500 مگابایت — 1 گیگابایت |
| فونتها و منابع | 90–99% | 5–20 مگابایت |
| محتوای وب | 50–70% | 50–200 مگابایت |
محدودیتهای Disk Cache در iOS: سیستم میتواند در هر زمان در صورت کمبود فضای دیسک، محتویات دایرکتوری Caches را حذف کند. این رفتار قابل پیکربندی نیست — iOS خود تصمیم میگیرد چه زمانی و کدام فایلهای حافظه نهان حذف شوند. بنابراین حافظه نهان نباید حاوی دادههایی باشد که قابل بازیابی از شبکه یا منابع دیگر نیستند.
تأثیر بر حافظه فلش: نوشتن مکرر در Disk Cache سایش حافظه فلش را تسریع میکند. iOS از TRIM و wear leveling برای به حداقل رساندن سایش استفاده میکند، اما به توسعهدهندگان توصیه میشود از نوشتن بیش از حد خودداری کنند: حافظه نهان را برای یک فایل بیشتر از هر 5 دقیقه یک بار بهروز نکنید؛ نوشتنهای کوچک را در یک نوشتن گروهبندی کنید؛ برای دادههای موقتی که نیاز به ذخیره روی دیسک ندارند از NSCache استفاده کنید.
حافظه نهان دو سطحی — معماری استاندارد برای برنامههای iOS: حافظه (NSCache) برای دادههایی که مکرراً به آنها دسترسی پیدا میشود و دیسک (URLCache یا سفارشی) برای دادههایی که باید بین جلسات حفظ شوند. مدت زمان زندگی در حافظه — دقیقه، روی دیسک — ساعت یا روز.
ذخیرهسازی تصاویر: از کتابخانههای تخصصی (Kingfisher, SDWebImage, Nuke) استفاده کنید که حافظه نهان دو سطحی با باطلسازی خودکار، مدیریت حافظه و نوشتن ناهمزمان روی دیسک را پیادهسازی میکنند. پیادهسازی مستقل حافظه نهان تصاویر نیازمند در نظر گرفتن رمزگشایی، فضای رنگی و مقیاسبندی است.
حافظه نهان و امنیت: دادههای محرمانه (رمزهای عبور، توکنها، دادههای شخصی) را بدون رمزنگاری روی دیسک ذخیره نکنید. URLCache به طور پیشفرض دادهها را رمزنگاری نمیکند — برای محتوای حساس از NSFileProtection یا رمزنگاری در سطح برنامه استفاده کنید. برای درخواستهای شبکه با احراز هویت از سیاست .reloadIgnoringLocalCacheData استفاده کنید.
نظارت بر حافظه نهان: hit ratio، اندازه فعلی حافظه نهان و تعداد نوشتهها در دقیقه را ردیابی کنید. اگر hit ratio به زیر 30% برسد — حافظه نهان ناکارآمد است و نیاز به بازبینی استراتژی یا افزایش اندازه دارد. به گفته Point-Free (2024), نظارت بر حافظه نهان یکی از کمتوجهترین روشهای بهینهسازی عملکرد برنامههای iOS است.
سوالات متداول
Disk Cache — فناوری ذخیرهسازی دادهها روی دیسک دستگاه برای تسریع دسترسی مجدد. در iOS، URLCache داخلی پاسخهای HTTP را ذخیره میکند و توسعهدهندگان میتوانند حافظههای نهان سفارشی را از طریق دایرکتوری Caches ایجاد کنند.
RAM Cache (NSCache) دادهها را در حافظه رم ذخیره میکند — سریعتر است، اما با راهاندازی مجدد برنامه از بین میرود. Disk Cache کندتر است، اما بین جلسات حفظ میشود. استراتژی بهینه از هر دو سطح استفاده میکند: حافظه برای دادههای داغ، دیسک برای دادههای سرد.
بله, سیستم میتواند در هر زمان در صورت کمبود فضا، محتویات دایرکتوری Caches را حذف کند. بنابراین هرگز دادههایی را که قابل بازیابی نیستند در حافظه نهان ذخیره نکنید. برای اسناد کاربر از دایرکتوری Documents استفاده کنید.
اندازه حافظه نهان به نوع داده بستگی دارد: برای تصاویر 100–500 مگابایت، برای پاسخهای API 10–50 مگابایت، برای ویدئو تا 1 گیگابایت. hit ratio را ردیابی کنید — اگر به زیر 50% برسد، اندازه حافظه نهان را افزایش دهید یا استراتژی باطلسازی را تغییر دهید.
URLCache.removeAllCachedResponses() حافظه نهان داخلی را پاک میکند. برای حافظه نهان سفارشی، فایلها را از دایرکتوری Caches از طریق FileManager حذف کنید. همیشه به کاربر امکان پاک کردن حافظه نهان را در تنظیمات برنامه بدهید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید