2017-12-17 91 views
5

में उपयोग किया जाता है यह प्रश्न मेरी समझ के लिए है क्योंकि मेरा कोड ठीक काम कर रहा है। मैंने एसडीवेब इमेज के अंदर देखा है, लेकिन यह काफी बड़ा है और मैं यह तय नहीं कर सकता कि जिस तंत्र पर मैं सवाल कर रहा हूं, वह कैसे काम करता है।एसडीवेब इमेज द्वारा उपयोग की जाने वाली तंत्र को समझना जब UITableView

ठीक है, मान लें कि मेरे पास UIImageViews (प्रत्येक सेल के अंदर एक) से भरा एक टेबलव्यू है, और मैं उनमें से प्रत्येक पर एसडीवेब इमेज श्रेणी/एक्सटेंशन को वेब से एक छवि लोड करने और आलसी लोड करने के लिए कॉल करता हूं।

तालिका को पुनः लोड किए बिना, नई डाउनलोड की गई छवि के साथ स्क्रीन पर सेल को अपडेट करने के लिए कौन सी तंत्र को नियोजित किया गया है?

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

मैं इस धारणा के तहत था कि मुझे तालिका दृश्य को फिर से लोड करना होगा, लेकिन इसके बजाय प्रत्येक सेल छवि छवि को उपलब्ध होने पर 'स्वचालित रूप से अपडेट' दिखाई देगी!

यह कैसे काम करता है? क्या SDWebImage प्रत्येक सेल/छवि का संदर्भ रखता है क्या यह काम कर रहा है?

उत्तर

3

SDWebImage आवेषण भरी हुई छवि देख सकते हैं के रूप में।

UITableViewCell साथ

आप, थोड़ा अपने कोशिकाओं में गैर-प्रासंगिक चित्रों से बचने की मुश्किल हो करने के लिए है यहाँ क्यों है: सर्वोच्च पर

  1. कल्पना कीजिए कि आप पहले आइटम (firstURL) की URL के लिए छवि का अनुरोध किया दृश्यमान सेल
  2. आप अपनी तालिका के नीचे स्क्रॉल, और निम्न होता है:
    • पूर्व सर्वोच्च सेल पुन: उपयोग किया जाता है और तालिका के निचले भाग पर दिखाई देता है।
    • छवि पिछले सेल (lastURL) के URL के लिए पूछताछ की गई है।
  3. firstURL लोड हो रहा है पूरी की, और इसी छवि, अंतिम सेल की छवि देखने में डाला जाता है, क्योंकि यह छवि को देखने के लिए जो firstURL लोड हो रहा है पूछे किया गया है।
  4. lastURL लोड हो रहा है, और इसी छवि को अंतिम सेल के छवि दृश्य में डाला गया है।

चरण 3 और 4 छवि दृश्य में तेज़ झपकी की तरह लग सकते हैं।

इससे बचने के लिए, आपको UITableViewCell सबक्लास के विधि कार्यान्वयन में पिछले डाउनलोड को रद्द करने की आवश्यकता है।

उदा।

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self.imageView sd_cancelCurrentImageLoad]; 
    self.imageView.image = <placeholder image>; 
} 
2

आप UITableViewCell में UIImageView बात कर रहे हैं तो आप उस SDWebImage जांच कर सकते हैं UIImageView वर्ग में से एक तरह का वर्णन करने के लिए तो कोई ज़रूरत नहीं जो छवि दृश्य डाउनलोड की छवि के लिए संदर्भित करता है, अपने स्वयं के रूप में पहचान

मैं आपको एक बार दिखाने दें .. जैसा कि हम इस तरह के सेल के अंदर छवि के लिए अनुरोध करते हैं।

[cell.imgBrand sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
    if (error != nil) { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
}]; 

जब पहली पंक्ति निष्पादित, यह UIImageView+WebCache.h वर्ग के भीतर विधि कॉल करेंगे। आप UIImageView उदाहरण है जिस पर लोड बेन पूछे है में उस वर्ग में ही UIImageView

@implementation UIImageView (WebCache) 

Class For SDWebCache UIImageView

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