التخزين المؤقت في Swift (iOS/macOS): Redis وأدوات أخرى
التخزين المؤقت هو أحد الاستراتيجيات الرئيسية لتحسين أداء تطبيقات الأجهزة المحمولة وسطح المكتب بلغة Swift. فهو يسمح بتقليل وقت تحميل البيانات، وتخفيف الحمل على الشبكة والخوادم، وضمان عمل التطبيق في وضع عدم الاتصال. في نظام Apple البيئي، تتوفر آليات مدمجة (NSCache، URLCache) بالإضافة إلى حلول خارجية، بما في ذلك التكامل مع Redis. في هذه المقالة، سنشرح بالتفصيل أدوات التخزين المؤقت الرئيسية لنظامي iOS وmacOS مع أمثلة على الكود.
1. آليات التخزين المؤقت المدمجة في Foundation
NSCache — ذاكرة تخزين مؤقت خفيفة الوزن في الذاكرة
NSCache هي ذاكرة تخزين مؤقت آمنة للخيوط وتدار تلقائيًا، وتقوم بحذف الكائنات عند نقص الذاكرة. وهي مثالية للتخزين المؤقت المؤقت للصور أو بيانات النماذج أو نتائج العمليات الحسابية.
import Foundation
let imageCache = NSCache<NSString, UIImage>()
// تعيين الحدودimageCache.countLimit = 100 // الحد الأقصى 100 كائنimageCache.totalCostLimit = 50 * 1024 * 1024 // 50 ميجابايت
// الحفظfunc cacheImage(_ image: UIImage, forKey key: String) { imageCache.setObject(image, forKey: key as NSString, cost: image.size.width * image.size.height * 4)}
// الاسترجاعfunc getCachedImage(forKey key: String) -> UIImage? { return imageCache.object(forKey: key as NSString)}المزايا: البساطة، التنظيف التلقائي، دعم تكلفة الكائنات.
العيوب: تخزين مؤقت في الذاكرة فقط، لا يوجد استمرارية.
URLCache — التخزين المؤقت لطلبات HTTP
URLCache يقوم تلقائيًا بتخزين استجابات URLSession مؤقتًا. يعمل في الذاكرة وعلى القرص. يمكن تكوينه عالميًا أو لجلسة معينة.
import Foundation
// إعداد ذاكرة تخزين مؤقت بحجم 50 ميجابايت في الذاكرة و 100 ميجابايت على القرصlet cache = URLCache(memoryCapacity: 50 * 1024 * 1024, diskCapacity: 100 * 1024 * 1024, diskPath: "myCache")URLCache.shared = cache
// الاستخدام مع URLSessionlet config = URLSessionConfiguration.defaultconfig.urlCache = cacheconfig.requestCachePolicy = .returnCacheDataElseLoadlet session = URLSession(configuration: config)
let request = URLRequest(url: URL(string: "https://api.example.com/data")!)let task = session.dataTask(with: request) { data, response, error in // سيتم تخزين البيانات مؤقتًا تلقائيًا}task.resume()تتم إدارة سياسة التخزين المؤقت من خلال رؤوس Cache-Control الخاصة بالخادم أو requestCachePolicy.
2. التخزين المؤقت للملفات للوصول دون اتصال
عند الحاجة إلى حفظ البيانات بين عمليات تشغيل التطبيق، يتم استخدام التخزين المؤقت للملفات في دليل Caches. وهو مناسب لملفات JSON أو الصور أو الكائنات المسلسلة.
import Foundation
class FileCache { private let fileManager = FileManager.default private lazy var cacheDirectory: URL = { let paths = fileManager.urls(for: .cachesDirectory, in: .userDomainMask) return paths[0].appendingPathComponent("DataCache", isDirectory: true) }() init() { try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) } func save(data: Data, forKey key: String) { let fileURL = cacheDirectory.appendingPathComponent(key) try? data.write(to: fileURL) } func load(forKey key: String) -> Data? { let fileURL = cacheDirectory.appendingPathComponent(key) return try? Data(contentsOf: fileURL) } func clearAll() { try? fileManager.removeItem(at: cacheDirectory) try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) }}