2015-02-18 12 views
12

साथ सर्वर पर बदल रहा से सर्वर से छवियों को डाउनलोड करने के लिए SDWebImage पुस्तकालय का उपयोग कर रहा। https://github.com/rs/SDWebImageकैश में छवि कैसे अपडेट करें जब छवि SDWebImage

एसडीवेब इमेज कैश की गई छवि को अपडेट करने में सक्षम नहीं है जब छवि उसी यूआरएल के साथ सर्वर पर अपडेट की जाती है।

उत्तर

0

यदि वह URL वहाँ अब के लिए SDWebImage उस छवि को पता है सर्वर पर बदल दिया गया है जिस तरह से है नहीं बदला है।

+0

उत्तर के लिए धन्यवाद है। यूआरएल सर्वर पर अपडेट होने पर यूआरएल समान होता है।समस्या यह है कि, जब मैं सर्वर पर छवि को अद्यतन करता हूं और पिछली स्क्रीन पर वापस जाता हूं तो तालिका दृश्य को पुनः लोड करने के बाद छवि अभी भी वही होती है। – Shubham

+0

हां, छवि वही है क्योंकि यह पहले ही कैश है और यूआरएल नहीं बदला गया है। तो SDWebImage नहीं जानता कि छवियों को सर्वर की ओर बदल दिया गया था। [एडगर] (http://stackoverflow.com/a/28586476/4525866) समाधान का प्रयास करें। – salabaha

+0

हां, समस्या है। लेकिन जब मैं टेबलव्यू को पुनः लोड करता हूं तो इसे छवि को अपडेट करना चाहिए। – Shubham

15

SDWebImage डिफ़ॉल्ट रूप से कुछ कैशिंग करता है, तो यह करता है, तो छवि परिवर्तन एक नया URL उपयोग करने के लिए बेहतर होगा। इसलिए, उदाहरण के लिए, यदि आपके पास यूआरएल पर नियंत्रण है और जब भी छवि बदल जाती है तो इसे बदल सकते हैं, तो आप ऐसा कर सकते हैं।

अगर ऐसी बात नहीं है, इस तरह, HTTP कैश नियंत्रण हेडर का सम्मान करने में options क्षेत्र में SDWebImageRefreshCached प्रयोग करके देखें:

[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] 
      placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] 
        options:SDWebImageRefreshCached]; 

अधिक here

+4

मैंने पहले से ही इस कोड को आजमाया है लेकिन यह छवि को अपडेट नहीं कर रहा है। समस्या यह है कि, जब मैं सर्वर पर छवि को अद्यतन करता हूं और पिछली स्क्रीन पर वापस जाता हूं तो तालिका दृश्य को पुनः लोड करने के बाद भी छवि समान होती है। – Shubham

+0

आपको यह सुनिश्चित करना होगा कि सर्वर सही HTTP कैश नियंत्रण शीर्षलेख स्थापित कर रहा है। मैंने बस एक मास्टर-> विस्तार संरचना और ड्रॉपबॉक्स से साझा किए गए यूआरएल से एक छवि के साथ एक एकल सेल के साथ एक नमूना परियोजना का परीक्षण किया, विवरण स्क्रीन पर गया, उसी नाम को बनाए रखने और यूआरएल साझा करते समय ड्रॉपबॉक्स पर छवि बदल दी, सुनिश्चित करें कि ड्रॉपबॉक्स सिंकिंग समाप्त हो गया, ऐप पर वापस दबाया गया और छवि अपडेट की गई। नमूना प्रोजेक्ट पर एक नज़र डालें [RefreshCachedImageTest] (https://github.com/Eddpt/RefreshCachedImageTest) – Edgar

+0

हां, ड्रॉपबॉक्स छवियों के लिए इसका कामकाजी प्रीफेक्ट। मुझे लगता है कि मुद्दा सर्वर की ओर से है। क्या आप सर्वर की ओर से कोई विचार करते हैं? – Shubham

9

अद्यतन: मैंने वास्तव में कैश सत्यापन के बारे में एक संपूर्ण मार्गदर्शिका लिखी गई, जिसमें कैश सत्यापन https://kean.github.io/blog/image-caching

SDWebImageका उपयोग करता हैजब आप SDWebImageRefreshCached विकल्प सेट करते हैं। ऐप्पल की यूआरएल लोडिंग सिस्टम कैश प्रतिक्रियाओं सत्यापन सहित HTTP कैश लागू करता है।

मूल रूप से, सर्वर प्रत्येक प्रतिक्रिया में HTTP कैश नियंत्रण हेडर से कुछ में शामिल करने की जरूरत है: HTTP कैश काफी जटिल है, लेकिन वहाँ HTTPS संचय पर कई शुरुआती मार्गदर्शक हैं है। कई अलग-अलग रणनीतियां हैं जिनका उपयोग पुनर्मूल्यांकन को लागू करने के लिए किया जा सकता है। आप या तो Last-Modified या ETag का उपयोग कर सकते हैं। इस तरह जब भी ग्राहक अनुरोध भेजता है तो यह स्वचालित रूप से आपके अनुरोध में Last-Modified या ETag पहले कैश प्रतिक्रिया से मूल्य शामिल होगा। अगर छवि नहीं बदली है तो सर्वर स्टेटस कोड 302 (संशोधित नहीं) और NSURLConnection/NSURLSession के साथ प्रतिक्रिया देगा, आपको पारदर्शी रूप से NSURLCache से कैश प्रतिक्रिया देगा। आपको डेटा फिर से डाउनलोड करने की ज़रूरत नहीं है, फिर भी जब भी आप अनुरोध करते हैं तो आपको सर्वर से जांच करने की आवश्यकता होती है।

आप HTTP कैश नियंत्रण का उपयोग एक समय समाप्ति तिथि निर्दिष्ट कर सकते हैं। यदि समाप्ति तंत्र का उपयोग किया जाता है, तो NSURLConnection/NSURLSession कैश्ड प्रतिक्रिया को तब तक संशोधित नहीं करेगा जब तक कि यह समाप्त नहीं हो जाता है।

HTTP कैश नियंत्रण के बारे में अधिक जानकारी के लिए लिंक के ऊपर देखते हैं। HTTP कैश एक सार्वभौमिक कैश तंत्र है जिसे जब भी संभव हो उपयोग किया जाना चाहिए। (: मेरे द्वारा writted त्याग)

मैं छवि लोड करने के लिए Nuke ढांचे का उपयोग करने के लिए सिफारिश करेंगे। यह डिफ़ॉल्ट रूप से NSURLCache का उपयोग करता है जबकि अभी भी मेमोरी कैश होता है जिसमें असम्पीडित छवियां होती हैं।

+0

अलग-अलग नोट पर, जैसा कि मैं न्यूक की कोशिश कर रहा हूं, कैश से किसी विशेष छवि को हटाने और नया पुनः लोड करने का कोई तरीका है? पूरे कैश को साफ़ करने का एक तरीका ताकि सभी छवियों को सर्वर से पुनः लोड किया जा सके? –

2

यहाँ तेजी से 3 में एक कोड कैश हर ताज़ा करने के लिए

imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached) 
संबंधित मुद्दे