लगभग हर मोबाइल एप्लिकेशन को नेटवर्क से कोई डेटा प्राप्त होता है।
दुर्भाग्य से, नेटवर्क तक पहुंच हमेशा संभव नहीं है, और इसलिए डेवलपर के लिए एप्लिकेशन में नेटवर्क कैश को सही ढंग से लागू करना महत्वपूर्ण है।
इस संबंध में, मैंने लेखों की एक श्रृंखला लिखने का फैसला
किया कि कैश को लागू करने के
तरीके क्या हैं
और उन्हें कब लागू करना है ।
तो, परिचय।
कैशिंग के लिए रणनीतियाँ
कैशिंग के लिए दो दृष्टिकोण हैं: ऑन-डिमांड कैशिंग और प्री-कैशिंग।
ऑन-डिमांड कैशिंग ऑफ़लाइन सामग्री को देखने की अनुमति देता है जो पहले देखी गई थी। सर्वर से प्राप्त डेटा को डिवाइस पर संग्रहीत किया जाता है और प्रत्येक अनुरोध के लिए, उनकी प्रासंगिकता की जांच की जाती है। यदि डेटा प्रासंगिक है, तो इसे डिस्क से लिया जाता है, यदि नहीं, तो सर्वर के लिए एक अनुरोध भेजा जाता है।
प्री-कैशिंग का तात्पर्य है कि उपयोगकर्ता द्वारा आवश्यक सभी डेटा प्राप्त किए जाएंगे और तुरंत डिस्क पर सहेजे जाएंगे।
यह निर्धारित करने के लिए कि किस कैशिंग रणनीति का उपयोग करना है, आपको यह समझने की आवश्यकता है कि क्या डाउनलोड करने के बाद डेटा की पोस्ट प्रोसेसिंग आवश्यक हो सकती है। पोस्ट प्रोसेसिंग डाउनलोड किए गए डेटा के किसी भी संशोधन का अर्थ है। उदाहरण के लिए, HTML पृष्ठ में लिंक बदलना ताकि वे स्थानीय रूप से कैश्ड चित्रों को इंगित करें, आदि।
कैश कहां स्टोर करना है
एप्लिकेशन केवल जानकारी को अपने सैंडबॉक्स में संग्रहीत कर सकते हैं। चूंकि कैश्ड डेटा उपयोगकर्ता द्वारा उत्पन्न नहीं किया जाता है, इसलिए इसे NSCachesDirectory में संग्रहीत किया जाना चाहिए, और NSDocumentsDirectory में नहीं। सभी कैश्ड डेटा के लिए एक अलग निर्देशिका बनाने के लिए यह अच्छा अभ्यास है।
इस उदाहरण में, MyAppCache निर्देशिका लाइब्रेरी / कैश फ़ोल्डर में बनाई गई है:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDirectory = [paths objectAtIndex:0]; cachesDirectory = [cachesDirectory stringByAppendingPathComponent:@”MyAppCache”];
लाइब्रेरी / कैश फ़ोल्डर में कैश को संग्रहीत करने का कारण यह है कि iCloud (और iTunes) बैकअप से इस निर्देशिका को बाहर करता है। और, इसलिए, iCloud में सीमित स्थान (वर्तमान में एक मुफ्त खाते के लिए, यह लगभग 5 जीबी है) अनावश्यक डेटा संग्रहीत करने पर खर्च नहीं किया जाता है।
यदि एप्लिकेशन में गहन कैशिंग होता है, तो डिस्क के बजाय मेमोरी का उपयोग करने और एप्लिकेशन बंद होने पर डिस्क पर डेटा अपलोड करने की सिफारिश की जाती है। यह इस तथ्य के कारण है कि iPhone की फ्लैश मेमोरी में सीमित संख्या में लिखने / पढ़ने के चक्र हैं और इसे एक बार फिर से लोड करना अवांछनीय है।
कैश कैसे स्टोर करें
आईओएस पर, उपयोगकर्ता डेटा को स्टोर करने के कई अलग-अलग तरीके हैं। कैशिंग के लिए सबसे उपयुक्त: NSKeyedArchiver, कोर डेटा, SQLite, NSURLCache।
NSKeyedArchiver
डेटा मॉडल कैशिंग NSKeyedArchiver वर्ग का उपयोग करके कार्यान्वित किया जाता है। मॉडल ऑब्जेक्ट को संग्रहीत करने के लिए, मॉडल कक्षाओं को NSCoding प्रोटोकॉल को लागू करना चाहिए। अर्थात्, विधियाँ
- (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder;
यदि वर्ग NSCoding को लागू करता है, तो संग्रह के लिए यह निम्नलिखित विधियों में से एक को कॉल करने के लिए पर्याप्त है:
[NSKeyedArchiver archiveRootObject:objectForArchiving toFile:archiveFilePath];
[NSKeyedArchiver archivedDataWithRootObject:objectForArchiving];
पहला तरीका संग्रह आर्काइव फ़ाइल पथ के साथ बना देगा। दूसरा तरीका NSData ऑब्जेक्ट लौटाएगा। NSData आमतौर पर तेज़ है क्योंकि फ़ाइल तक पहुंचने के लिए कोई अतिरिक्त लागत नहीं है, लेकिन डेटा को एप्लिकेशन की मेमोरी में संग्रहीत किया जाएगा।
फ़ाइल (या NSData के लिए एक सूचक) से एक मॉडल को अनज़िप करने के लिए, NSKeyedUnarchiver वर्ग का उपयोग करें। निम्न विधियों में से एक का उपयोग करके डेटा को अनज़िप करें:
[NSKeyedUnarchiver unarchiveObjectWithData:data];
[NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath];
NSKeyedArchiver / NSKeyedUnarchiver का उपयोग करने के लिए आवश्यक है कि मॉडल NSCoding प्रोटोकॉल का पालन करें। NSCoding को लागू करना बहुत सरल है, लेकिन अगर बहुत सारी फाइलें हैं, तो इसमें बहुत समय लग सकता है। इसलिए, इस प्रक्रिया को स्वचालित करने के लिए, किसी प्रकार के उपकरण का उपयोग करना बेहतर है। उदाहरण के लिए,
AppCode विकास का
वातावरण ।
कोर डेटा
कोर डेटा में डेटा को स्टोर करने के लिए, आपको एक मॉडल फ़ाइल बनाने की ज़रूरत है जिसमें संस्थाओं (एंटिटीज़) का विवरण होता है, साथ ही उनके (रिश्ते) के बीच संबंध भी होते हैं, और डेटा को बचाने और पुनर्प्राप्त करने के लिए तरीके लिखते हैं। कोर डेटा का उपयोग करके, आप एक वास्तविक ऑफ़लाइन एप्लिकेशन मोड प्राप्त कर सकते हैं, जैसा कि मानक मेल और कैलेंडर अनुप्रयोगों में किया जाता है।
प्री-कैशिंग लागू करते समय, आपको समय-समय पर उन डेटा को हटाने की आवश्यकता होती है जिनकी आवश्यकता नहीं है। अन्यथा, कैश का आकार स्पष्ट रूप से बढ़ना शुरू हो जाएगा, जिससे प्रदर्शन का नुकसान होगा। परिवर्तनों के सेट पर नज़र रखने और उन्हें सर्वर पर वापस भेजने से स्थानीय परिवर्तन सिंक्रनाइज़ किए जाते हैं। ट्रैकिंग परिवर्तनों के लिए कई एल्गोरिदम हैं, लेकिन Git में काम करने वाले का उपयोग करना सबसे अच्छा है।
हालांकि कोर डेटा ऑन-डिमांड कैशिंग के लिए इस्तेमाल किया जा सकता है, यह सबसे अच्छा नहीं है। कोर डेटा का मुख्य लाभ सभी डेटा को अनज़िप किए बिना मॉडल गुणों तक पहुंच प्रदान कर रहा है। हालांकि, एक आवेदन में कोर डेटा को लागू करने की जटिलता इस लाभ को ओवरराइड करती है।
कच्चा SQLite
SQLite के साथ काम करने के लिए, आपको libsqlite3 लाइब्रेरी के साथ एप्लिकेशन को लिंक करना होगा, लेकिन इस दृष्टिकोण में महत्वपूर्ण नुकसान हैं।
कोर डेटा की तुलना में सभी sqlite3 पुस्तकालयों और ऑब्जेक्ट रिलेशनल मैपिंग (ORM) इंजन धीमा है। इसके अलावा, iOS में sqlite3 का कार्यान्वयन थ्रेड-सुरक्षित नहीं है। इसलिए यदि आप एक अलग संकलित sqlite3 लाइब्रेरी (थ्रेड-सुरक्षित ध्वज के साथ संकलित) का उपयोग नहीं कर रहे हैं, तो आप sqlite3 डेटाबेस के लिए थ्रेड-सुरक्षित पढ़ने / लिखने को सुनिश्चित करने के लिए जिम्मेदार हैं।
चूंकि कोर डेटा बहुत अधिक सुविधाएं (डेटा माइग्रेशन, अंतर्निहित थ्रेड-सेफ्टी, ...) की पेशकश कर सकता है, इसलिए इसे iOS पर देशी SQLite का उपयोग करने से बचने की सलाह दी जाती है।
NSURLCache
मांग पर कैशिंग के लिए आदर्श। आपको NSURLRequest द्वारा दिए गए डेटा को लगभग स्वचालित मोड में कैश करने की अनुमति देता है और इसके लिए न्यूनतम कोड की आवश्यकता होती है।
बस कुछ पंक्तियों और आपके एप्लिकेशन को अनुरोधों के लिए डिस्क कैश प्राप्त होगा।
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:URLCache]; }
दुर्भाग्य से, यह केवल REST सेवाओं के लिए उपयुक्त है और कुछ HTTP हेडर के साथ काम करते समय समस्याएं हैं।
निष्कर्ष
ऑन-डिमांड कैशिंग को लागू करने के लिए, NSURLCache या NSKeyedArchiver का उपयोग करना बेहतर है। एक पूर्ण ऑफ़लाइन मोड के कार्यान्वयन के लिए कोरडाटा के साथ काम करने की आवश्यकता होती है।
अगले भाग में, मैं NSURLCache / NSKeyedArchiver के साथ काम की विस्तार से जांच करने और उन मामलों का वर्णन करने की योजना बनाता हूं जिनके लिए वे उपयुक्त हैं।