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

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

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

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

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

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

5
Woodstock 17 पद 2017, 14:18

2 जवाब

सबसे बढ़िया उत्तर

SDWebImage लोड की गई छवि को UIImageView इंस्टेंस में सम्मिलित करता है जिस पर लोड को क्वेरी किया गया है।

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

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

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

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

जैसे

- (void)prepareForReuse {
    [super prepareForReuse];
    [self.imageView sd_cancelCurrentImageLoad];
    self.imageView.image = <placeholder image>;
}
3
Eugene Dudnyk 18 जिंदा 2019, 09:39

यदि आप 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

@implementation UIImageView (WebCache)

SDWebCache UIImageView के लिए कक्षा

3
Anjali jariwala 28 पद 2017, 07:36