Disk Cache: چیست، حافظه نهان دیسکی iOS و اصول کار

نویسنده: IT Sectr منتشر شده: 2026-07-11 زمان مطالعه: 7 دقیقه

Disk Cache — مکانیزمی برای ذخیره‌سازی موقت داده‌ها روی دیسک دستگاه است که به برنامه‌های iOS امکان می‌دهد دسترسی مجدد به منابع بارگذاری‌شده قبلی را تسریع کنند. به گفته Apple Developer Documentation, 2024, Disk Cache استفاده از شبکه را کاهش می‌دهد، بار باتری را کم می‌کند و عملکرد برنامه را در حالت آفلاین تضمین می‌کند. iOS چندین مکانیزم داخلی ذخیره‌سازی نهان ارائه می‌دهد: URLCache برای درخواست‌های شبکه، NSCache برای حافظه رم و پیاده‌سازی‌های سفارشی از طریق دایرکتوری Caches.

نکات اصلی

  • Disk Cache — ذخیره‌سازی داده‌ها روی دیسک برای تسریع دسترسی مجدد و کاهش ترافیک
  • URLCache — مکانیزم داخلی ذخیره‌سازی درخواست‌های HTTP در iOS
  • Caches directory — دایرکتوری مخصوص Sandbox برای داده‌های موقت برنامه
  • باطل‌سازی حافظه نهان برای به‌روزرسانی داده‌ها حیاتی است — استراتژی‌های زمانی، رویدادی و نسخه‌ای
  • سیستم می‌تواند حافظه نهان را پاک کند در صورت کمبود فضا — حافظه نهان نباید حاوی داده‌های غیرقابل جایگزین باشد

Disk Cache در iOS چیست؟

Disk Cache — فناوری ذخیره‌سازی موقت داده‌ها روی حافظه دائمی دستگاه (فلش) به منظور تسریع درخواست‌های بعدی به همان داده‌ها است. برخلاف حافظه نهان RAM، Disk Cache داده‌ها را پس از راه‌اندازی مجدد برنامه و حتی دستگاه حفظ می‌کند.

iOS دو سطح اصلی ذخیره‌سازی نهان ارائه می‌دهد: عملیاتی (NSCache، حافظه) و دیسکی (URLCache، سیستم فایل). حافظه نهان دیسکی 10–100 برابر کندتر از حافظه عملیاتی است، اما به طور قابل توجهی سریع‌تر از درخواست شبکه — تفاوت می‌تواند 2 تا 3 مرتبه بزرگی باشد. استراتژی بهینه از حافظه نهان دو سطحی استفاده می‌کند: حافظه برای داده‌های داغ و دیسک برای داده‌های سرد.

به گفته Apple Performance Optimization Guide, 2023, Disk Cache که به درستی پیکربندی شده باشد، زمان بارگذاری محتوا را در بازدیدهای مکرر 60–80% کاهش می‌دهد و مصرف ترافیک را 40–70% کم می‌کند. برای برنامه‌های دارای محتوای چندرسانه‌ای (تصاویر، ویدئو، صدا)، ذخیره‌سازی نهان یک عامل حیاتی برای تجربه کاربری است.

URLCache: مکانیزم داخلی ذخیره‌سازی نهان

URLCache — یک کلاس داخلی Foundation است که حافظه نهان ترکیبی برای درخواست‌های URLSession پیاده‌سازی می‌کند. این کلاس به طور خودکار پاسخ‌های سرور را روی دیسک و در حافظه ذخیره می‌کند و اندازه حافظه نهان و سیاست‌های باطل‌سازی را بر اساس هدرهای HTTP Cache-Control، Expires و ETag مدیریت می‌کند.

swift
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 برنامه ایجاد می‌کند.

swift
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 JSON40–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

حافظه نهان دو سطحی — معماری استاندارد برای برنامه‌های iOS: حافظه (NSCache) برای داده‌هایی که مکرراً به آنها دسترسی پیدا می‌شود و دیسک (URLCache یا سفارشی) برای داده‌هایی که باید بین جلسات حفظ شوند. مدت زمان زندگی در حافظه — دقیقه، روی دیسک — ساعت یا روز.

ذخیره‌سازی تصاویر: از کتابخانه‌های تخصصی (Kingfisher, SDWebImage, Nuke) استفاده کنید که حافظه نهان دو سطحی با باطل‌سازی خودکار، مدیریت حافظه و نوشتن ناهمزمان روی دیسک را پیاده‌سازی می‌کنند. پیاده‌سازی مستقل حافظه نهان تصاویر نیازمند در نظر گرفتن رمزگشایی، فضای رنگی و مقیاس‌بندی است.

حافظه نهان و امنیت: داده‌های محرمانه (رمزهای عبور، توکن‌ها، داده‌های شخصی) را بدون رمزنگاری روی دیسک ذخیره نکنید. URLCache به طور پیش‌فرض داده‌ها را رمزنگاری نمی‌کند — برای محتوای حساس از NSFileProtection یا رمزنگاری در سطح برنامه استفاده کنید. برای درخواست‌های شبکه با احراز هویت از سیاست .reloadIgnoringLocalCacheData استفاده کنید.

نظارت بر حافظه نهان: hit ratio، اندازه فعلی حافظه نهان و تعداد نوشته‌ها در دقیقه را ردیابی کنید. اگر hit ratio به زیر 30% برسد — حافظه نهان ناکارآمد است و نیاز به بازبینی استراتژی یا افزایش اندازه دارد. به گفته Point-Free (2024), نظارت بر حافظه نهان یکی از کم‌توجه‌ترین روش‌های بهینه‌سازی عملکرد برنامه‌های iOS است.

سوالات متداول

Disk Cache در iOS چیست؟

Disk Cache — فناوری ذخیره‌سازی داده‌ها روی دیسک دستگاه برای تسریع دسترسی مجدد. در iOS، URLCache داخلی پاسخ‌های HTTP را ذخیره می‌کند و توسعه‌دهندگان می‌توانند حافظه‌های نهان سفارشی را از طریق دایرکتوری Caches ایجاد کنند.

تفاوت Disk Cache با RAM Cache چیست؟

RAM Cache (NSCache) داده‌ها را در حافظه رم ذخیره می‌کند — سریع‌تر است، اما با راه‌اندازی مجدد برنامه از بین می‌رود. Disk Cache کندتر است، اما بین جلسات حفظ می‌شود. استراتژی بهینه از هر دو سطح استفاده می‌کند: حافظه برای داده‌های داغ، دیسک برای داده‌های سرد.

آیا iOS می‌تواند حافظه نهان من را حذف کند؟

بله, سیستم می‌تواند در هر زمان در صورت کمبود فضا، محتویات دایرکتوری Caches را حذف کند. بنابراین هرگز داده‌هایی را که قابل بازیابی نیستند در حافظه نهان ذخیره نکنید. برای اسناد کاربر از دایرکتوری Documents استفاده کنید.

چگونه اندازه مناسب حافظه نهان را انتخاب کنیم؟

اندازه حافظه نهان به نوع داده بستگی دارد: برای تصاویر 100–500 مگابایت، برای پاسخ‌های API 10–50 مگابایت، برای ویدئو تا 1 گیگابایت. hit ratio را ردیابی کنید — اگر به زیر 50% برسد، اندازه حافظه نهان را افزایش دهید یا استراتژی باطل‌سازی را تغییر دهید.

چگونه حافظه نهان را در برنامه iOS پاک کنیم؟

URLCache.removeAllCachedResponses() حافظه نهان داخلی را پاک می‌کند. برای حافظه نهان سفارشی، فایل‌ها را از دایرکتوری Caches از طریق FileManager حذف کنید. همیشه به کاربر امکان پاک کردن حافظه نهان را در تنظیمات برنامه بدهید.

خلاصه

  • Disk Cache — ذخیره‌سازی موقت داده‌ها روی دیسک برای تسریع دسترسی مجدد و کاهش ترافیک
  • URLCache — مکانیزم داخلی Foundation برای ذخیره‌سازی درخواست‌های HTTP با پشتیبانی Cache-Control
  • Caches directory — دایرکتوری Sandbox برای داده‌های موقت که توسط سیستم در کمبود فضا پاک می‌شود
  • باطل‌سازی حافظه نهان از طریق TTL، رویداد، نسخه یا LRU انجام می‌شود — انتخاب به نوع داده بستگی دارد
  • Hit ratio — معیار کلیدی کارایی حافظه نهان: 70%+ برای تصاویر، 40–60% برای API
  • حافظه نهان دو سطحی (RAM + دیسک) — معماری استاندارد برای برنامه‌های iOS
  • امنیت — داده‌های محرمانه نباید بدون رمزنگاری روی دیسک ذخیره شوند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید