मैं एक ऐप को कार्यान्वित कर रहा हूं जो बहुत से नेटवर्किंग कॉल को आराम-एपीआई पर कॉल करता है जिसे हम भी नियंत्रित करते हैं। हाल ही में हमने कुछ मूल्यवान नेटवर्किंग और सर्वर समय बचाने के लिए सर्वर पक्ष पर कैशिंग हेडर पेश करने का निर्णय लिया। जैसा कि हम पहले से नहीं जानते हैं कि डेटा कब तक वैध होगा, हम 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 +
नहीं उपयोग कर सकते हैं संग्रहीत करना चाहते हैं मौका है कि डिवाइस और सर्वर के बीच एक घड़ी सिंक मुद्दा है? चश्मा का कहना है कि उस मामले में ग्राहक का व्यवहार अपरिभाषित है (ग्राहक को उचित करने के लिए)। क्या आपने अधिक अंतर्दृष्टि प्राप्त करने के लिए बस नेटवर्कवर्क कोड को मापने की कोशिश की है? – Alex
समय मुद्दा मेरा पहला विचार था, लेकिन मुझे एक दोहराने योग्य परिदृश्य नहीं मिला (यह बहुत यादृच्छिक रूप से होता है)। वैसे भी, यह उचित समय और सर्वर पक्ष के साथ उपकरणों पर खुश है, इसलिए ऐसा नहीं लगता है :(टिप के लिए धन्यवाद! –