मैंने एनएसआरएल कैश पर अपने सिर को चिल्लाते हुए पूरी तरह से काफी समय बिताया है, इसलिए मैं उम्मीद में इस सलाह की पेशकश करता हूं कि अन्य मेरी दुर्भाग्य से बच सकते हैं।एनएसआरएल कैश आईओएस 5 पर असंगत परिणाम प्रदान करता है, प्रतीत होता है कि यादृच्छिक
यह सब काफी उचित रूप से बंद हो गया। मेरा नया ऐप प्रोजेक्ट केवल आईओएस 5 और उससे ऊपर का लक्ष्य रखता है, इसलिए मैंने सोचा कि मैं अपने सभी वेब कैशिंग आवश्यकताओं के लिए नए NSURLCache कार्यान्वयन का लाभ उठा सकता हूं। मुझे कुछ विशेष कार्यों को संभालने के लिए NSURLCache के कस्टम सबक्लास की आवश्यकता थी, लेकिन सभी को एपीआई द्वारा मददगार रूप से समर्थित लग रहा था। दस्तावेज की एक त्वरित पढ़ा है, और मैं दौड़ के लिए रवाना कर रहा हूँ:
[NSURLCache setSharedURLCache:[[MyCustomCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 //8mb
diskCapacity:32 * 1024 * 1024 // 32mb
diskPath:@"webcache.db"]];
मैं समझ एक 8MB कैश शुरू करने के लिए ठीक है, और मैं एक बड़ा डिस्क कैश के साथ इसे वापस कर देंगे तो हम में से अधिक सेवा कर सकते हैं स्थानीय रूप से हमारी बड़ी छवियों। मैं NSRLConnection का उपयोग करने के लिए अपने शेष नेटवर्क कोड को हुक करता हूं (वास्तव में, मैंने MKNetworkKit का उपयोग किया, लेकिन यह अप्रासंगिक साबित हुआ), और मेरे कैश से बड़ी चीजों की अपेक्षा करता है। निश्चित रूप से, कैश किए जाने वाले सभी अनुरोधों को कर्तव्य से बचाया जा रहा है, और प्रतिक्रियाएं जब वे कैश से परोसे जाते हैं तो जल्दी से वापस उड़ रहे हैं। यह समुद्री डाकू के समुद्री डाकू का नियमित उत्पादन है जो मेरे नेटवर्किंग स्टैक में इतनी कड़ी उड़ान भर रहा है।
कुछ जोड़ने के अलावा। कैश से परोसा जा सकता है अनुरोध अभी भी नेटवर्क पर बाहर जा रहे हैं। सिवाय जब वे नहीं हैं। यह पूरी तरह यादृच्छिक और अंतःक्रियात्मक प्रतीत होता है कि कैश वास्तव में अनुरोध करने के लिए उपयोग किया जाता है या नहीं। मैं अपने बालों को निराशा में फाड़ता हूं और सचमुच सब कुछ पता लगाने की कोशिश कर रहा हूं कि क्या हो रहा है। मैं परीक्षण ऐप्स बनाता हूं, पूरे स्थान पर ब्रेकपॉइंट्स सेट करता हूं, पैकेट निशान के माध्यम से फाड़ता हूं, इंटरनेट पर हर शब्द को पढ़ता हूं जो NSRLCache का उल्लेख करता है, कैश-कंट्रोल हेडर के साथ प्रयोग करता है, कोड को टिप्पणी करता है, मेरे सबक्लास को बाईपास करता है, और यहां तक कि दर्दनाक रूप से ट्रेसिंग का सहारा लेता है NSURLCache और उसके CFNetworking मित्रों के लिए असेंबली यह समझने की कोशिश करने के लिए कि रहस्यमय तर्क नीचे क्या है। मैं बड़े पैमाने पर एआरएम और उद्देश्य-सी कॉलिंग सम्मेलनों के बारे में अपने ज्ञान में सुधार करता हूं और निम्न स्तर के डिबगिंग के बारे में काफी कुछ सीखता हूं, लेकिन वास्तव में यह पता लगाने में कहीं भी नहीं मिलता कि क्या हो रहा है। पूरी चीज आईओलांथे के Nightmare Song की तरह समुद्री डाकू राजा की सौहार्दपूर्ण तानाशाही की तुलना में बहुत अधिक महसूस कर रही है और मैं इसे दूर फेंकने के कगार पर काफी अधिक हूं।
टीएल/डीआर संस्करण: NSURLCache काम करता प्रतीत होता है, लेकिन यादृच्छिक रूप से कैश किए गए परिणामों को वापस नहीं करता है, भले ही यह उपलब्ध हो।
क्या आप NSURLConnection, UIWebView, या दोनों के लिए कैशिंग का उपयोग करने का प्रयास कर रहे हैं? मैंने कुछ महीने पहले डब्ल्यूडब्ल्यूडीसी में एक सफारी डेवलपर के साथ UIWebView कैशिंग पर चर्चा की। उन्होंने कहा कि एक दोहरी परत कैश है। अपने स्वयं के डिबगिंग परीक्षणों से, मैंने पाया है कि ओएस-स्तरीय सफारी कैश की जांच करने से पहले '+ [NSURLCache sharedURLCache]' चेक किया गया है। हालांकि, प्रतिक्रिया आपके ऐप के साझा कैश में कैश नहीं की जाएगी, और कौन जानता है कि ओएस स्तर कैश कैसे व्यवहार करता है। – goldierox
दिलचस्प। मैंने केवल NSRLConnection पक्ष पर ध्यान केंद्रित किया है, क्योंकि हमारा ऐप UIWebView का अधिक उपयोग नहीं करता है। मुझे याद है कि ओएस-स्तरीय सफारी कैश का उपयोग ऐप्स द्वारा नहीं किया गया था, लेकिन मुझे विश्वास है कि यह मामला नहीं है, खासकर UIWebView के लिए। –