परिचय: क्यों कैशिंग स्विफ्ट अनुप्रयोगों के प्रदर्शन की कुंजी है
\n\nस्विफ्ट में आधुनिक विकास में, चाहे वह iOS एप्लिकेशन हो या Vapor पर सर्वर-साइड समाधान, गति और इंटरफ़ेस की प्रतिक्रियाशीलता सीधे डेटा के कुशल प्रबंधन पर निर्भर करती है। कैशिंग केवल परिणामों को "याद रखना" नहीं है, बल्कि यह एक संपूर्ण विज्ञान है कि डेटा तक पहुंच के समय को कैसे कम किया जाए, नेटवर्क और डेटाबेस पर लोड को कैसे कम किया जाए, और पीक लोड के दौरान भी सुचारू संचालन सुनिश्चित किया जाए।
\n\nउन्नत स्तर पर, स्विफ्ट डेवलपर्स को एक विकल्प का सामना करना पड़ता है: अंतर्निहित तंत्र (NSCache, URLCache) का उपयोग करें या Redis और Memcached जैसी बाहरी प्रणालियों को कनेक्ट करें। इनमें से प्रत्येक उपकरण की अपनी वास्तुकला और अनुप्रयोग क्षेत्र है। इस लेख में, हम चर्चा करेंगे कि स्विफ्ट इकोसिस्टम में इन समाधानों को प्रभावी ढंग से कैसे एकीकृत और संयोजित किया जाए।
\n\n1. अंतर्निहित समाधान: NSCache और URLCache
\n\n1.1 NSCache — ऑब्जेक्ट्स के लिए हल्का कैश
\n\nNSCache Foundation में निर्मित एक थ्रेड-सुरक्षित शब्दकोश है। यह उन ऑब्जेक्ट्स को कैश करने के लिए आदर्श है जिन्हें बनाना या लोड करना महंगा है (उदाहरण के लिए, चित्र, जटिल गणनाओं के परिणाम)। मुख्य लाभ मेमोरी की कमी होने पर स्वचालित सफाई है, जो मोबाइल अनुप्रयोगों के लिए महत्वपूर्ण है।
import Foundation\n\nfinal class ImageCache {\n static let shared = ImageCache()\n private let cache = NSCache<NSString, UIImage>()\n \n private init() {\n cache.countLimit = 100 // अधिकतम 100 ऑब्जेक्ट\n cache.totalCostLimit = 50 * 1024 * 1024 // 50 MB\n }\n \n func getImage(for key: String) -> UIImage? {\n return cache.object(forKey: key as NSString)\n }\n \n func setImage(_ image: UIImage, for key: String, cost: Int? = nil) {\n if let cost = cost {\n cache.setObject(image, forKey: key as NSString, cost: cost)\n } else {\n cache.setObject(image, forKey: key as NSString)\n }\n }\n \n func removeImage(for key: String) {\n cache.removeObject(forKey: key as NSString)\n }\n \n func clearAll() {\n cache.removeAllObjects()\n }\n}\n\nमहत्वपूर्ण बारीकियाँ:
\n- \n
countLimitऔरtotalCostLimitसिफारिशें हैं, कठोर सीमाएँ नहीं। सिस्टम स्वयं तय करता है कि ऑब्जेक्ट्स को कब हटाना है। \n - कुंजियाँ
NSStringप्रकार की होनी चाहिए, न किString(स्विफ्ट उन्हें स्वचालित रूप से ब्रिज करता है, लेकिन स्पष्ट रूप से कास्ट करना बेहतर है)। \n - बड़े डेटा के लिए
NSCacheका उपयोग न करें जो मेमोरी में फिट नहीं होता। \n
1.2 URLCache — नेटवर्क अनुरोधों का कैशिंग
\n\nURLCache HTTP अनुरोधों के लिए एक सिस्टम कैश है। यह स्वचालित रूप से सर्वर प्रतिक्रियाओं (Cache-Control हेडर को ध्यान में रखते हुए) को सहेजता है और नेटवर्क पर जाए बिना उन्हें वापस करता है। कॉन्फ़िगरेशन आपको मेमोरी और डिस्क की मात्रा को नियंत्रित करने की अनुमति देता है।
import Foundation\n\n// पूरे एप्लिकेशन के लिए URLCache सेटअप\nlet memoryCapacity = 20 * 1024 * 1024 // 20 MB\nlet diskCapacity = 100 * 1024 * 1024 // 100 MB\nlet cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myCache")\nURLCache.shared = cache\n\n// URLSession के साथ उपयोग का उदाहरण\nlet config = URLSessionConfiguration.default\nconfig.requestCachePolicy = .returnCacheDataElseLoad // पहले कैश, फिर नेटवर्क\nconfig.urlCache = cache\n\nlet session = URLSession(configuration: config)\nlet url = URL(string: "https://api.example.com/data")!\nlet task = session.dataTask(with: url) { data, response, error in\n // डेटा कैश से लिया जाएगा, यदि वह मौजूद है और पुराना नहीं हुआ है\n}\ntask.resume()\n\nउन्नत सलाह: कैश को जबरन अपडेट करने के लिए .reloadIgnoringLocalCacheData नीति का उपयोग करें, और मैन्युअल प्रबंधन के लिए cachedResponse(for:) और storeCachedResponse(_:for:) विधियों का उपयोग करें।