क्या किसी NSURLRequest को कैशिंग डेटा से रोकना या अनुरोध के बाद कैश्ड डेटा को निकालना संभव है?


89

IPhone पर, मैं डेटा का एक हिस्सा के लिए NSURLRequest का उपयोग करके HTTP अनुरोध करता हूं। ऑब्जेक्ट आवंटन स्पाइक्स और मैं तदनुसार डेटा असाइन करता हूं। जब मैं डेटा के साथ समाप्त करता हूं, तो मैं इसे तदनुसार मुक्त करता हूं - हालांकि उपकरण किसी भी डेटा को मुक्त नहीं किया गया है!

मेरा सिद्धांत है कि डिफ़ॉल्ट रूप से HTTP अनुरोधों को कैश किया जाता है, हालांकि - मैं नहीं चाहता कि मेरा iPhone ऐप इस डेटा को कैश करे।

क्या अनुरोध के बाद इस कैश को साफ़ करने का कोई तरीका है या किसी डेटा को पहली जगह में कैश होने से रोका जा सकता है?

मैंने सभी कैश नीतियों का उपयोग करने की कोशिश की है, जो नीचे दी गई है:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

लेकिन स्मृति को मुक्त करने के लिए कुछ भी नहीं लगता है!


क्या यह संभव होगा कि यह कैश से संबंधित न हो? क्या आपने यह देखने के लिए डेटा का निरीक्षण करने की कोशिश की है कि क्या जो डेटा फिर से लोड किया जाना चाहिए था वह वास्तव में पुराना है? हो सकता है कि आपका लीक कहीं और से आ रहा हो। आप NSURLRequests को कैसे आरंभ और मुक्त करते हैं? इस समस्या का निदान करने में मदद मिल सकती है।
lpfavreau

FYI करें - यदि आप ब्रूट फोर्स द्वारा फाइलों को हटाना चाहते हैं, तो ऐसा करने के लिए उदाहरण कोड है: यहां salesforce.stackexchange.com/a/69736
zekel

जवाबों:


157

आमतौर पर अनुरोध को इस तरह बनाना आसान होता है

NSURLRequest *request = [NSURLRequest requestWithURL:url
      cachePolicy:NSURLRequestReloadIgnoringCacheData
      timeoutInterval:60.0];

फिर कनेक्शन बनाएं

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
       delegate:self];

और कनेक्शन को लागू करें: willCacheResponse: प्रतिनिधि पर विधि। बस लौटते हुए नील को करना चाहिए।

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
  return nil;
}

आपकी मदद के लिए यहाँ बहुत धन्यवाद! निक।
निक कार्टराइट

1
उस विचार के लिए धन्यवाद - मैं बार-बार इस तरह SOAP वेब सेवा को कॉल कर रहा था और यह लीक को अनियंत्रित रूप से बढ़ा रहा था, भले ही लीक कुछ भी गलत नहीं दिखा रहा था। मैंने दिनों के लिए अनुकूलित किया और अंत में कैशिंग को रोकने की कोशिश की क्योंकि आंतरिक ढांचे से बहुत सीएफयूआरएल * ऑब्जेक्ट्स घूम रहे थे। WillCacheResponse से शून्य लौटना ही एक ऐसी चीज़ थी जो काम करती थी!
ब्रॉन डेविस

15
दोनों NSURLRequestReloadIgnoringCacheData को लागू करना और लागू करना क्यों आवश्यक है connection:willCacheResponse:?
फेब

1
नमस्ते, क्या यह संभव है कि मैं इसका उपयोग स्थानीय सामग्री लोड करने के लिए कर सकूं? उपरोक्त NSUrlConnection के लिए है, लेकिन मैं NSUrlRequest का उपयोग करके UIWebView में स्थानीय HTML डेटा लोड कर रहा हूं। मुझे किसी भी कैशिंग को अस्वीकार करने की आवश्यकता है क्योंकि SQLite से वेबव्यू में जाने वाली छवियां हैं और प्रत्येक पृष्ठ लोड के साथ मेमोरी बढ़ रही है। धन्यवाद।
जिम

7
@ एफएबीबी, ओवरराइडिंग connection:willCacheResponse:आपको कैश में प्रतिक्रिया को संग्रहीत नहीं करने देता है। NSURLRequestReloadIgnoringCacheDataनिर्दिष्ट करता है कि कनेक्शन को कैश की जांच के बिना अनुरोध को लोड करना चाहिए। पूर्व निश्चित रूप से स्मृति आवंटन के प्रबंधन में मदद करता है।
क्रिस्टोफर पिक्सले 22

12

जब मैं ट्विटर से जानकारी का अनुरोध करता हूं तो मेरे ऐप में भी यही समस्या है। मेरे मामले में मुझे उन क्रेडेंशियल्स को संरक्षित करने की आवश्यकता नहीं थी, इसलिए मैं अगले कोड का उपयोग करके उन्हें सरल मिटा देता हूं:

- (void) eraseCredentials{
NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [credentialsStorage allCredentials];

//iterate through all credentials to find the twitter host
for (NSURLProtectionSpace *protectionSpace in allCredentials)
    if ([[protectionSpace host] isEqualToString:@"twitter.com"]){
        //to get the twitter's credentials
        NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace];
        //iterate through twitter's credentials, and erase them all
        for (NSString *credentialKey in credentials)
            [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace];
    }
}

मुझे आशा है कि यह किसी के लिए काम करता है :)


यह मेरी समस्या का एक सही समाधान था, मुझे पुनः समस्या थी, क्योंकि क्रेडेंशियल्स संग्रहीत थे और स्वचालित रूप से NSURLConnection द्वारा प्रस्तुत किए जा रहे थे, बहुत बहुत धन्यवाद इससे मुझे बड़ा समय मिला :)
RVN

धन्यवाद यह मेरे लिए काम कर रहा है, मैं वास्तव में आपके सुझाव की सराहना करता हूं। वास्तव में मेरी समस्या यह है कि NSURLRequest उपयोगकर्ता नाम और पासवर्ड संग्रहीत करता है। तो यह कैश से उपयोगकर्ता क्रेडेंशियल को हटाने में मदद करता है ...
नीलेश कीकानी

10

यदि आप NSURLConnection का उपयोग करते हैं तो प्रतिनिधि पर एक नज़र डालें:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

प्रतिलाभ की मात्रा

कैश में संग्रहीत करने के लिए वास्तविक कैश्ड प्रतिक्रिया। प्रतिनिधि कैश्ड अप्रकाशित वापस आ सकता है, संशोधित कैश्ड प्रतिक्रिया लौटा सकता है, या कनेक्शन के लिए कोई कैश्ड प्रतिक्रिया संग्रहीत नहीं की जानी चाहिए।


यहाँ बहुत धन्यवाद। मेरे ऐप की मेमोरी फ़ुटप्रिंट अचानक आधी हो गई है! निक।
निक कार्टराइट

9

यदि आप उपयोग कर रहे हैं NSURLSession, तो Cache.dbiOS के लिए लिखे गए अनुरोधों और मापदंडों को रोकने के लिए एक और समाधान ऐप की Cachesनिर्देशिका के भीतर बनाता है , NSURLCacheसत्र के कॉन्फ़िगरेशन के लिए 0 आकार मेमोरी और 0 आकार डिस्क कैश जैसे सेट करना है।

let configuration = URLSessionConfiguration.default    
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)

या जैसा कि ऊपर उल्लेखित है वैश्विक कैश स्तर पर

URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

संभवतः यह डिस्क आकार के लिए 0 है जो iOS लेखन को डिस्क पर रोक देता है लेकिन अगर आपके पास एक नीति है reloadIgnoringLocalCacheDataतो आप शायद मेमोरी कैशिंग में रुचि नहीं रखते हैं।

नोट यह किसी भी Caches/Cache.db(अनुरोध और प्रतिक्रियाओं) या Caches/fsCachedData/फ़ोल्डर (प्रतिक्रिया डेटा) को बनाए जाने से रोक देगा । हमने सुरक्षा दृष्टिकोण के लिए एक ऐप में इस दृष्टिकोण को लेने का फैसला किया है क्योंकि हम नहीं चाहते हैं कि हमारे अनुरोध डिस्क कैश पर संग्रहीत किए जाएं।

अगर किसी को पता है कि केवल अनुरोध कैशिंग को रोकने का एक तरीका है, लेकिन iOS URL लोडिंग तंत्र से प्रतिक्रिया डेटा कैशिंग रखना है, तो मुझे जानने की दिलचस्पी होगी। (इसके बारे में कोई एपीआई या आधिकारिक दस्तावेज नहीं है जो मैं बता सकता हूं)


7

यदि किसी एक अनुरोध के लिए विशिष्ट नहीं है (U संपूर्ण एप्लिकेशन के लिए कैश को अक्षम करना चाहते हैं) एक सबसे अच्छा विकल्प है। इस कोड को एप्लिकेशन प्रतिनिधि या उर की जरूरत के आधार पर किसी भी स्थान पर देखें।

        int cacheSizeMemory = 0*4*1024*1024; // 0MB
        int cacheSizeDisk = 0*32*1024*1024; // 0MB
        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
        [NSURLCache setSharedURLCache:sharedCache];

7
मेरे लिए बहुत अच्छा काम करता है, लेकिन आप 0 का उपयोग सिर्फ गुणा करने के बजाए कर सकते हैं, जो कि 0 वैसे भी समाप्त होता है।
गैरी रिच

1
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

सर्वर को सही तरीके से लागू करने पर, Cache-Control:no-storeहेडर को अनुरोध में डालकर उसी हेडर के साथ एक सर्वर प्रतिक्रिया उत्पन्न होगी, इस प्रकार NSURLCacheडिस्क पर प्रतिक्रिया डेटा को संग्रहीत नहीं किया जाएगा।

इसलिए, NSURLCacheडिस्क कैशिंग अक्षम करने के शॉटगन दृष्टिकोण की कोई आवश्यकता नहीं है ।

पुनश्च: शीर्ष लेख जोड़ना सभी HTTP फ्रेमवर्क के लिए काम करना चाहिए, जैसे AFNetworking

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.