2013-09-02 12 views
7

मैं एक ऐप को कार्यान्वित कर रहा हूं जो बहुत से नेटवर्किंग कॉल को आराम-एपीआई पर कॉल करता है जिसे हम भी नियंत्रित करते हैं। हाल ही में हमने कुछ मूल्यवान नेटवर्किंग और सर्वर समय बचाने के लिए सर्वर पक्ष पर कैशिंग हेडर पेश करने का निर्णय लिया। जैसा कि हम पहले से नहीं जानते हैं कि डेटा कब तक वैध होगा, हम Cache-control: max-age या Expires शीर्षलेख नहीं भेज रहे हैं, हम सभी Last-Modified शीर्षलेख E-tag के साथ एक साथ भेजते हैं, इसलिए हम हमेशा सर्वर पर हिट करते हैं लेकिन प्रतिक्रियाएं बहुत तेज़ी से होती हैं 304 के साथ समय। सब कुछ पहले ठीक काम करने लग रहा था, कई अनुरोध कैश किए जा रहे थे। हालांकि, कैशिंग के कारण ऐप पर कुछ यादृच्छिक डेटा त्रुटियों का अनुभव कर रहा हैNSURLCache कैशिंग यादृच्छिक प्रतिक्रियाओं को कैश नहीं किया जाना चाहिए

किसी कारण से मैं समझ नहीं पा रहा हूं, कुछ बिंदु अनुरोधों को स्थानीय रूप से कैश किया जा रहा है और सर्वर को मारने के बिना "अद्यतन" डेटा के रूप में उपयोग किया जाता है, जब वे वास्तव में नहीं होते हैं। कुछ समय बीतने तक समस्या तब तक रहती है। फिर सब कुछ सामान्य रूप से सर्वर पर जाता है, ठीक उसी तरह यह cache-control शीर्षलेख के साथ व्यवहार करेगा, लेकिन इसके बिना! तो, मेरा सवाल यह है:


कैसे NSURLConnection साथ NSURLCache एक साथ कर सकते हैं तय करते हैं कि एक विशेष अनुरोध ऑनलाइन जाने के लिए जब मूल अनुरोध Cache-control: max-age या Expires हेडर के साथ नहीं आया था की जरूरत नहीं है? क्या किसी ने भी इसी तरह के प्रभाव का अनुभव किया है? और पूरे कैश को हटाने के बिना मैं इसे कैसे हल कर सकता हूं?


कुछ और पृष्ठभूमि जानकारी:

  • मैं AFNetworking उपयोग कर रहा हूँ, लेकिन यह NSURLConnection पर निर्भर करता है इसलिए मैं यह कुछ भी बदल जाता है नहीं लगता कि
  • इस्तेमाल किया कैश डिफ़ॉल्ट [NSURLCache sharedURLCache] उदाहरण
  • है
  • यह GET अनुरोध है, और जब मैं कैश प्रतिक्रिया से शीर्षलेखों की जांच करता हूं तो मुझे यह मिलता है:

    po [response allHeaderFields]

    "Access-Control-Allow-Headers" = "Content-Type"; 
    "Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT"; 
    "Access-Control-Allow-Origin" = "*"; 
    Connection = "keep-alive"; 
    "Content-Encoding" = gzip; 
    "Content-Length" = 522; 
    "Content-Type" = "application/json"; 
    Date = "Mon, 02 Sep 2013 08:00:38 GMT"; 
    Etag = "\"044ad6e73ccd45b37adbe1b766e6cd50c\""; 
    "Last-Modified" = "Sat, 31 Aug 2013 10:36:06 GMT"; 
    Server = "nginx/1.2.1"; 
    "Set-Cookie" = "JSESSIONID=893A59B6FEFA51566023C14E3B50EE1E; Path=/rest-api/; HttpOnly"; 
    
  • मुझे लगता है या पुन: पेश जब त्रुटि तो समाधान है कि कैश हटाने पर भरोसा होने जा रहा है नहीं कर सकते हैं एक विकल्प नहीं हैं।

  • मैं iOS5 +
+0

नहीं उपयोग कर सकते हैं संग्रहीत करना चाहते हैं मौका है कि डिवाइस और सर्वर के बीच एक घड़ी सिंक मुद्दा है? चश्मा का कहना है कि उस मामले में ग्राहक का व्यवहार अपरिभाषित है (ग्राहक को उचित करने के लिए)। क्या आपने अधिक अंतर्दृष्टि प्राप्त करने के लिए बस नेटवर्कवर्क कोड को मापने की कोशिश की है? – Alex

+0

समय मुद्दा मेरा पहला विचार था, लेकिन मुझे एक दोहराने योग्य परिदृश्य नहीं मिला (यह बहुत यादृच्छिक रूप से होता है)। वैसे भी, यह उचित समय और सर्वर पक्ष के साथ उपकरणों पर खुश है, इसलिए ऐसा नहीं लगता है :(टिप के लिए धन्यवाद! –

उत्तर

2

उपयोग कर रहा हूँ बयान के अनुसार "कुछ बिंदु अनुरोध पर स्थानीय रूप से कैश और के रूप में इस्तेमाल किया जा रहा है" अद्यतन "डेटा सर्वर मार के बिना" मैं बहुत यकीन है कि आपके अनुरोधों स्मृति हैं हूँ कैश की गई।

NSURLCache स्मृति में डेटा को कैश करता है। डिस्क पर नहीं तो मुझे बताएं कि आपके साथ क्या हो रहा है।

आपने ऐप लॉन्च किया है। एक वेब सेवा कॉल बनाता है यह सर्वर से डेटा प्राप्त करता है आप फिर से कॉल करते हैं और यह सर्वर पर कॉल किए बिना स्मृति से प्रतिक्रिया प्राप्त करता है और आपको परिणाम दिखाता है।

आप ऐप को कभी-कभी छोड़ देते हैं या ऐप को पुनरारंभ करते हैं। यह जांचता है कि डेटा उनकी स्मृति में है या नहीं।यदि यह उपलब्ध नहीं है तो यह फिर से सर्वर पर कॉल करता है और उसी व्यवहार को दोहराता है।

मैं तुम्हें सलाह देते हैं बजाय NSURLConnection और NSUrlCache पर भरोसा करने की उसी के लिए अपने स्वयं के डिस्क कैशिंग लिखने के लिए होगा। क्योंकि कैशिंग नीतियों में से कुछ अभी भी ऐप्पल से लागू नहीं हैं।

+0

धन्यवाद वैलभव। जैसा कि मैंने कहा कि यह वास्तव में कैश के साथ एक समस्या है, लेकिन यह है ऐसा नहीं है कि कुछ कैश नहीं किया गया है, लेकिन इसके विपरीत: कैश नहीं किया जाना चाहिए कुछ कैश किया गया है।इसके अलावा, यह डिस्क पर सहेजा गया है, लेकिन इसकी उम्मीद है क्योंकि आईओएस 5 तंत्रिका कैश डिस्क पर बचाता है। –

4

NSURLConnection के साथ एक साथ NSURLCache कैसे तय करते हैं कि एक विशेष अनुरोध जब ऑनलाइन जाने की जरूरत नहीं है ...

धारा RFC 2616 के 13.2 का कहना है:

के बाद से मूल सर्वर करना हमेशा स्पष्ट समाप्ति बार प्रदान करते हैं HTTP कैश आम तौर पर अनुमानी समाप्ति बार आवंटित, एल्गोरिदम कि अन्य शीर्ष लेख मान (जैसे अंतिम एम के रूप में उपयोग को रोजगार एक व्यावहारिक समाप्ति समय का अनुमान लगाने के लिए समय) संशोधित किया गया। HTTP/1.1 विनिर्देश विशिष्ट एल्गोरिदम प्रदान नहीं करता है, लेकिन उनके परिणामों पर सबसे खराब-केस बाधा लगाता है। अनुमानी समाप्ति बार अर्थ पारदर्शिता समझौता हो सकता है के बाद से, वे सावधानी से किया जाना चाहिए, और हम मूल सर्वर के रूप में ज्यादा संभव के रूप में स्पष्ट समाप्ति बार प्रदान करने के लिए प्रोत्साहित करते हैं।

तो, यूआरएल लोडिंग सिस्टम के लिए यह तय करना संभव है कि कैश डेटा "ताजा पर्याप्त" है, भले ही आपने डेटा के लिए विशिष्ट जीवनकाल प्रदान नहीं किया हो।

सर्वोत्तम परिणामों के लिए, आप अपनी प्रतिक्रिया हेडर में एक विशिष्ट जीवन प्रदान करने के लिए प्रयास करना चाहिए। यदि ऐसा हेडर जोड़ना असंभव है, तो शायद आप इसके बजाय अनुरोध बदल सकते हैं। if-modified-since या cache-control प्रत्येक कैश डेटा से बचने में आपकी सहायता कर सकता है।

+1

यह अब तक का सबसे अच्छा जवाब है। यह समस्या का समाधान नहीं करता है लेकिन कम से कम आरएफसी 2616 पर अनुच्छेद बताता है कि मैं क्या अनुभव कर रहा हूं। धन्यवाद! –

2

अपने NSURLRequest कैश नीति NSURLRequestReturnCacheDataElseLoad

यहाँ

पर सेट किया जाता है कि यदि आप AFHTTPClient.m में AFNetworking उपयोग कर रहे हैं आप विधि

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
            path:(NSString *)path 
          parameters:(NSDictionary *)parameters 

ओवरराइड कर सकते हैं इस

के साथ लाइन 470 की जगह सुनिश्चित करें
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15]; 

क्या आप वास्तव में क्या कर रहे हैं कैश लोड करने के लिए करता है, तो सर्वर updated..if नहीं सर्वर अद्यतन किया जाता है है अनुरोध कह रहा है तो यह कैश ध्यान न दें और सर्वर से

FYI सामग्री को डाउनलोड करेगा: memory..if में डेटा NSURLCache भंडार आप डेटा डिस्क में तुम मेरे यहाँ वर्ग

https://github.com/shoeb01717/Disc-Cache-iOS

+0

धन्यवाद लेकिन जैसा कि समझाया गया है कि समस्या यह नहीं है कि वह जानकारी का पीछा नहीं किया जाता है, लेकिन पूरी तरह विपरीत: यह कैश नहीं होने पर कैश करता है। डिस्क पर आईओएस 5 कैश के अलावा, अपनी खुद की कक्षा को लागू करने से शायद ज्यादा मदद नहीं मिलेगी, हालांकि मैं इसे आज़माउंगा। –

+1

@Shoeb: FYI, चूंकि ios5 NSURLCACHE चलो आप डिस्क या मेमोरी चुनते हैं, और आकार भी आवंटित करते हैं। – Alex

+0

धन्यवाद मैं आईओएस 5 सुविधाओं के बारे में जानता था, लेकिन मैंने जो वर्ग बनाया है वह आपको ऐप के मुख्य बंडल से कैश वापस करने देगा। –

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