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) — تعيش البيانات لمدة زمنية محددة بعد الكتابة؛ بالاستناد إلى الحدث — إبطال بناءً على حدث (مثلاً، تحديث البيانات على الخادم)؛ بالاستناد إلى الإصدار — إبطال عند تغيير إصدار API أو تنسيق البيانات؛ LRU (Least Recently Used) — إزالة تلقائية للإدخالات الأقل استخدامًا عند تجاوز حد الحجم.
قاعدة عملية: TTL مناسب للأخبار والمحتوى الذي يقدم بشكل قابل للتوقع. بالاستناد إلى الحدث للبيانات المدارة عبر الخادم بواسطة إعلامات الدفع. بالاستناد إلى الإصدار للتكوينات وذاكرات نماذج البيانات. 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 هي تقنية لتخزين البيانات على قرص الجهاز لتسريع الوصول المتكرر. يقوم URLCache المضمن في iOS بتخزين استجابات HTTP مؤقتًا، ويمكن للمطورين إنشاء ذاكرات مؤقتة مخصصة عبر دليل Caches.
RAM Cache (NSCache) يخزن البيانات في الذاكرة العشوائية — أسرع، ولكنه يفقد عند إعادة تشغيل التطبيق. Disk Cache أبطأ ولكنه يستمر بين الجلسات. تستخدم الاستراتيجية المثلى كلا المستويين: الذاكرة للبيانات الساخنة، القرص للبيانات الباردة.
نعم، يمكن للنظام حذف محتوى دليل Caches في أي وقت عند نقص مساحة القرص. لذا، لا تقم أبدًا بتخزين بيانات غير قابلة للاستعادة في الذاكرة المؤقتة. استخدم دليل Documents لوثائق المستخدم.
يعتمد حجم الذاكرة المؤقتة على نوع البيانات: 100–500 ميجابايت للصور، 10–50 ميجابايت لاستجابات API، وصولًا إلى 1 جيجابايت للفيديو. راقب hit ratio — إذا انخفض أدنى من 50%، زد حجم الذاكرة المؤقتة أو غير استراتيجية الإبطال.
URLCache.removeAllCachedResponses() يمسح الذاكرة المؤقتة المضمنة. للذاكرة المؤقتة المخصصة، احذف الملفات من دليل Caches عبر FileManager. قدم دائمًا للمستخدمين خيار مسح الذاكرة المؤقتة عبر إعدادات التطبيق.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.