2012-01-20 10 views
8

कैशिंग नहीं कर रहा है इसलिए मैंने NSURLCache उपclassed है और हर बार जब मैं loadHTMLFromString: पर कॉल करता हूं तो यह storeCachedRequest:forRequest: और फिर cachedResponseForRequest: पर कॉल करता है। यहाँ मैं क्या है:NSURLCache

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request 
{ 
    NSString *pathString = [[request URL] absoluteString]; 

    NSCachedURLResponse * response = [super cachedResponseForRequest:request]; 
    if (response != nil) 
     return response; 
    else { 
     NSString* myString= @"testing"; 

     NSData* data=[myString dataUsingEncoding: NSASCIIStringEncoding ]; 

     // 
     // Create the cacheable response 
     // 
     NSURLResponse *response = 
     [[[NSURLResponse alloc] 
      initWithURL:[request URL] 
      MIMEType:[self mimeTypeForPath:pathString] 
      expectedContentLength:[data length] 
      textEncodingName:nil] 
     autorelease]; 
     NSCachedURLResponse * cachedResponse = 
     [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease]; 

     [self storeCachedResponse:cachedResponse forRequest:request] ; 

     //NSLog(@"DEFAULT CACHE WITH URL %@", [[request URL] absoluteString]); 
     return [super cachedResponseForRequest:request]; 
    } 

    return nil; 
} 

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request 
{ 
    [super storeCachedResponse:cachedResponse forRequest:request]; 

    NSLog(@"STORE CACHED RESPONSE WITH URL %@", [[request URL] absoluteString]); 
} 

मुद्दा यह है कि जब मैं cachedResponseForRequest: सही होने के बाद यह सहेजा जाता है कहते हैं, प्रतिक्रिया हमेशा नहीं के बराबर है है। ऐसा क्यों है?

मैं था:

NSURLRequest * req = [NSURLRequest requestWithURL:[NSURL URLWithString:self.imageSource_]]; 
NSCachedURLResponse * response = [[NSURLCache sharedURLCache] cachedResponseForRequest:req]; 

if (response == nil) 
    NSLog(@"RESPONSE IS NIL"); 
else { 
    NSString* theString = [[NSString alloc] initWithData:response.data encoding:NSASCIIStringEncoding]; 
    NSLog(@"RESPONSE IS NOT NIL %@", theString); 
} 

और यह हमेशा प्रिंट प्रतिक्रिया नहीं के बराबर है। यूआरएल स्ट्रिंग वही है जब यह storeCachedResponse था। किसी कारण से यह कैशिंग नहीं है। मैंने कैश आकार को कुछ मात्रा में सेट कर दिया है।

उत्तर

1

100% निश्चित नहीं है, लेकिन मुझे लगता है कि आपको NSURLResponse का उपयोग करने की आवश्यकता है जो आपके स्वयं के निर्माण के बजाय आपके NSURLConnection द्वारा वापस लौटा दिया गया है। मेरा संदेह यह है कि यदि आप सिर्फ NSURLResponse बनाते हैं तो इसमें कैशिंग के लिए कोई हेडर सेट नहीं है, और इसलिए NSURLCache मानता है कि इसे इस विशेष परिणाम को कैश करना चाहिए।

+0

हमम ... क्या आप इसके बारे में निश्चित हैं? क्योंकि storeCachedResponse को cachedResponseForRequest और प्रतिक्रिया == शून्य उस विधि में – adit

+0

से पहले ठीक कहा गया था, भले ही मैं अपना स्वयं का NSURLResponse नहीं बना रहा हूं, फिर भी यह – adit

+0

"हमम ... क्या आप इसके बारे में निश्चित हैं?" मेरे जवाब के पहले तीन शब्द फिर से पढ़ें। ;-) –

1

कैश करने या नहीं चुनने पर डिफ़ॉल्ट NSURLCache बहुत यादृच्छिक प्रतीत होता है। आपकी सबसे अच्छी शर्त इसे उपclass करने और उन फ़ाइलों की कैशिंग को संभालने के लिए हो सकती है जिन्हें आप सीधे कैश में रखते हैं ResponseForRequest: और बाकी को सुपर के लिए छोड़ दें।

संबंधित मुद्दे