التخزين المؤقت في Swift (iOS/macOS): Redis وNSCache وCore Data

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التخزين المؤقت في Swift (iOS/macOS): من الذاكرة إلى Redis



في تطوير تطبيقات iOS وmacOS، يُعد التخزين المؤقت أداة رئيسية لتسريع أداء التطبيقات، وتقليل الحمل على الخادم، وتحسين تجربة المستخدم. في هذه المقالة، سنستعرض الأساليب الأساسية للتخزين المؤقت في Swift: من NSCache البسيط إلى الحلول الاحترافية القائمة على Redis وSQLite. لكل طريقة مجال استخدامها الخاص، ويعتمد الاختيار الصحيح على نوع البيانات وحجمها ومتطلبات الاستمرارية.



1. NSCache — تخزين مؤقت مدمج في الذاكرة



NSCache هو ذاكرة تخزين مؤقت خفيفة الوزن وآمنة للخيوط، مدمجة في Foundation. يقوم تلقائياً بتحرير الذاكرة عند نقص الموارد، مما يجعله مثالياً لتخزين الصور وبيانات API والكائنات المؤقتة الأخرى.



import Foundation

class ImageCache { private let cache = NSCache<NSString, UIImage>() func getImage(forKey key: String) -> UIImage? { return cache.object(forKey: key as NSString) } func setImage(_ image: UIImage, forKey key: String) { cache.setObject(image, forKey: key as NSString) } func removeImage(forKey key: String) { cache.removeObject(forKey: key as NSString) }}


المزايا:

  • لا يتطلب إعداداً — يعمل فوراً.
  • يدير الذاكرة تلقائياً (يزيل الكائنات عند didReceiveMemoryWarning).
  • آمن للخيوط.


العيوب:

  • تُفقد البيانات عند إعادة تشغيل التطبيق.
  • غير مناسب للبيانات كبيرة الحجم (محدود بالذاكرة العشوائية RAM).


2. Core Data كذاكرة تخزين مؤقت مستمرة



غالباً ما يُستخدم Core Data ليس فقط كـ ORM، ولكن أيضاً كذاكرة تخزين مؤقت للبيانات المنظمة. هذا مفيد عندما تحتاج إلى حفظ كائنات معقدة مع علاقات وإجراء تصفية.



import CoreData

class CoreDataCache { private let context: NSManagedObjectContext init(context: NSManagedObjectContext) { self.context = context } func cacheResponse(_ data: Data, forKey key: String) { let cached = CachedResponse(context: context) cached.key = key cached.data = data cached.timestamp = Date() try? context.save() } func getCachedResponse(forKey key: String) -> Data? { let fetchRequest: NSFetchRequest<CachedResponse> = CachedResponse.fetchRequest() fetchRequest.predicate = NSPredicate(format: "key == %@", key) fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: false)] fetchRequest.fetchLimit = 1 guard let result = try? context.fetch(fetchRequest).first else { return nil } return result.data }}


متى يُستخدم:

  • يجب حفظ البيانات بين الجلسات.
  • هناك حاجة لتصفية معقدة (مثل البحث عن نص).
  • حجم البيانات معتدل (حتى بضع مئات الآلاف من السجلات).


3. Redis — تخزين مؤقت من جانب الخادم لـ Swift



Redis هو مخزن بيانات عالي الأداء في الذاكرة يعمل عبر الشبكة. في سياق Swift (iOS/macOS)، يُستخدم Redis غالباً على جانب الخادم (Vapor، Kitura) لتخزين الجلسات ونتائج الاستعلامات المعقدة وقوائم المهام. ومع ذلك، توجد مكتبات عميلة تسمح بالاتصال بـ Redis مباشرة من تطبيق الهاتف المحمول (مثل عبر RediStack).



import RediStack

final class RedisCache { private let connection: RedisConnection init(host: String, port: Int = 6379) async throws { self.connection = try await RedisConnection.connect( to: .init(hostname: host, port: port) ) }

توصيات