مقدمة: لماذا التخزين المؤقت في تطبيقات Swift؟
\nالتخزين المؤقت هو أحد التقنيات الرئيسية لتحسين أداء تطبيقات الهواتف المحمولة والخوادم. في عالم Swift (iOS/macOS)، يسمح التخزين المؤقت الصحيح بتقليل وقت تحميل البيانات، وتقليل الحمل على الشبكة وقاعدة البيانات، بالإضافة إلى تحسين تجربة المستخدم. في هذه المقالة، سنستعرض ثلاثة أساليب رئيسية للتخزين المؤقت في Swift: الحل المضمن NSCache، وأنظمة الخوادم الشائعة Redis وMemcached، بالإضافة إلى دمجها في مشاريع iOS/macOS.
1. التخزين المؤقت المضمن: NSCache وURLCache
\nمعظم تطبيقات iOS لا تحتاج إلى خوادم خارجية - يكفي استخدام الآليات المضمنة من Apple.
\n\n1.1 NSCache - ذاكرة تخزين مؤقت بسيطة وفعالة في الذاكرة
\nNSCache هو قاموس آمن للخيوط يقوم تلقائياً بحذف الكائنات عند نقص الذاكرة. مثالي لتخزين الصور، استجابات JSON، أو أي كائنات مكلفة في الحساب.
import Foundation\n\nclass ImageCache {\n private let cache = NSCache<NSString, NSData>()\n\n func setImageData(_ data: Data, forKey key: String) {\n cache.setObject(data as NSData, forKey: key as NSString)\n }\n\n func getImageData(forKey key: String) -> Data? {\n return cache.object(forKey: key as NSString) as Data?\n }\n}\nنصيحة: قم بتعيين الحدود countLimit وtotalCostLimit للحصول على أداء مثالي.
1.2 URLCache - تخزين مؤقت لطلبات الشبكة
\nURLCache يقوم تلقائياً بتخزين استجابات HTTP على القرص وفي الذاكرة. يتم التهيئة عبر URLSessionConfiguration:
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024, // 50 MB\n diskCapacity: 100 * 1024 * 1024, // 100 MB\n diskPath: "myCache")\nlet session = URLSession(configuration: config)\nهذا مفيد بشكل خاص للمحتوى الثابت (الصور، استجابات API ذات عمر طويل).
\n\n2. Redis في مشاريع Swift
\nRedis هو مخزن بيانات في الذاكرة يدعم الهياكل (سلاسل، قوائم، تجزئات). في مشاريع Swift من جانب الخادم (Vapor, Perfect)، يُستخدم Redis للجلسات، قوائم الانتظار، والتخزين المؤقت السريع.
\n\n2.1 توصيل Redis عبر Vapor
\nيوفر Vapor الحزمة vapor/redis. التثبيت:
// Package.swift\ndependencies: [\n .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]\nمثال لتخزين بيانات المستخدم مؤقتاً:
\nimport Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n let key = "user:\\(user.id)"\n let data = try JSONEncoder().encode(user)\n try await request.redis.set(key, to: data)\n // تعيين TTL (مدة الحياة) ساعة واحدة\n try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n let key = "user:\\(id)"\n guard let data = try await request.redis.get(key, as: Data.self) else {\n return nil\n }\n return try JSONDecoder().decode(User.self, from: data)\n}\n\n2.2 مزايا Redis لـ Swift
\n- \n
- السرعة: البيانات مخزنة في الذاكرة العشوائية - زمن استجابة أقل من ميلي ثانية. \n
- TTL: انتهاء صلاحية تلقائي للمفاتيح. \n
- Pub/Sub: اتصال غير متزامن بين الخدمات. \n
3. Memcached: تخزين مؤقت موزع خفيف
\nMemcached هو نظام تخزين مؤقت أقدم ولكنه لا يزال شائعاً. على عكس Redis، لا يدعم هياكل البيانات المعقدة والاستمرارية، لكنه بسيط وفعال للغاية لتخزين المفتاح-القيمة المؤقت.
\n\n