2013-08-29 16 views
5

मैं छवियों के लिए उत्सुक लोड गुच्छा करने के लिए कोशिश कर रहा हूँ:SDWebImage उत्सुक लोड छवियों

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:nil]; 
} 

यह इन छवियों को डाउनलोड नहीं कर रहा है। हालांकि, अगर मैं एक खाली समापन ब्लॉक में पास करता हूं, जैसे:

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { }]; 
} 

तो यह ठीक काम करता है। मेरा सवाल है: क्यों? क्या ऐसा करने के लिए इससे अच्छा तरीका है? एक खाली ब्लॉक में गुजरना मेरे लिए सही नहीं लगता है।

उत्तर

18

जो एपीआई आप उपयोग कर रहे हैं वह सही नहीं है।

छवियों को प्रीफ़ेच करने और उन्हें कैश में स्टोर करने के लिए, SDWebImagePrefetcher का उपयोग करें जो इसके लिए है।

NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count]; 
for (NSDictionary *s in things) { 
    [urls addObject:[NSURL URLWithString:s[photo]]]; 
} 
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls]; 

एक तरफ ध्यान दें मैं प्रस्तुत एक पुल अनुरोध के रूप में - जो सिर्फ विलय कर दिया गया -, एपीआई में एक completedBlock की उपस्थिति आप (गलत) कर रहे हैं का उपयोग कर लागू करने के लिए इतना है कि अन्य प्रोग्रामर नहीं होगा आपको अपनी गलती में गिरना

+0

बिल्कुल सही, धन्यवाद! – 0xSina

+4

एफवाईआई, यदि आप पूर्णता ब्लॉक के बिना यह कई बार कर रहे हैं तो हो सकता है कि आप 'sharedImagePrefetcher' का उपयोग नहीं करना चाहें, क्योंकि यह नए करने से पहले वर्तमान में चल रहे प्रीफ़ेच ऑपरेशंस को रद्द कर देगा। मैं अपने कोड में साझा किए गए एक का उपयोग करने के बजाय एक नया स्थान आवंटित करता हूं। –

+0

@EnricoSusatyo यह बहुत बड़ा है। इसे साफ करने के लिए धन्यवाद। – kevinl

1

यदि आप -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation को ध्यान से देखें, तो आप लाइनों मिल जाएगा:

if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && isFailedUrl)) 
{ 
    if (completedBlock) 
    { 
     // Complain about invalid URL, completely irrelevant to us at this point. 
     ... 
    } 
    return operation; 
} 

तो हाँ, यह कुछ भी करता है, तो completionBlocknil है करता है। क्यूं कर? शायद, SDWebImage डेवलपर्स ने उस पैरामीटर को पारित किए बिना विधि को बेकार माना। आप उनसे पूछने के लिए बेहतर गिटहब मुद्दा तैयार करेंगे।

+1

यह समझ में आता है। यदि आप छवि के साथ कुछ भी नहीं कर रहे हैं, तो आप इसे पहले स्थान पर क्यों उपयोग कर रहे हैं? हालांकि इसे लागू करने के लिए उन्हें पैरामीटर दावा का उपयोग करना चाहिए। –

+1

@ गैब्रिएल पेट्रोनेला मैं सहमत हूं, लेकिन 0xSina का इसका उपयोग करने का तरीका पूरी तरह से प्राकृतिक है। यह एक डिजाइन दोष है। – iHunter

+0

डेवलपर को सूचित करने के लिए उन्हें अपवाद उठाना चाहिए। मैं एक पुल अनुरोध कर रहा हूँ। –

0

SDWebImage पूरा होने के ब्लॉक समस्या का समाधान हो गया है और इस स्विफ्ट की एक पंक्ति के साथ अब संभव है:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray) 
संबंधित मुद्दे