2010-08-18 11 views
5

मुख्य धागे को अवरुद्ध किए बिना मांग पर UIImages लोड करने का एक अच्छा तरीका क्या है?मुख्य धागे को अवरुद्ध किए बिना फ़ाइलों से आलसी लोडिंग UIImages?

संदर्भ: मेरे पास दीवार पर दो हजार छवियां हैं जिन्हें मैं स्क्रॉल कर सकता हूं। जाहिर है, सभी यूआईएममेज को लोड करना संभव नहीं है, इसलिए अभी मैं उन लोगों को लोड कर रहा हूं जो प्रदर्शित हो रहे हैं, और फिर उन्हें तब रिलीज़ कर रहे हैं जब उन्हें अब आवश्यकता नहीं है। समस्या यह है कि फ़ाइलों से UIImages लोड करने में काफी समय लगता है, स्क्रॉल करते समय स्टटरिंग का कारण बनने के लिए काफी लंबा समय लगता है। ये किसी भी तरह से बड़ी छवियों (लगभग 250x250, शायद 20-30kb प्रत्येक) नहीं हैं, लेकिन वे अभी भी stuttering का कारण बनता है।

उत्तर

0

मैं इस तरह के कुछ के लिए एक कस्टम UIImageView उपclass का उपयोग करता हूं। इसका उपयोग ज्यादातर छवियों को डाउनलोड करने के लिए किया जाता है (उदाहरण के लिए ट्विटर स्ट्रीम में अवतार और छवियां सोचें), इसलिए यह किसी URL से छवि डाउनलोड करने के लिए NSURLConnection का उपयोग करता है। URLConnection तब पूरा होने पर एक प्रतिनिधि विधि को कॉल करता है, जिसे मैं UIImageView को अपडेट करने के लिए उपयोग करता हूं। बाद में जोड़ा गया एक अतिरिक्त कैश छवियों के साथ एक स्थिर शब्दकोश है, इसलिए छवियों का उपयोग अक्सर हर बार डाउनलोड नहीं किया जाना चाहिए। यह पहले उल्लेख किए गए ट्विटर अवतार जैसी चीजों के लिए बहुत उपयोगी है।

मैं अगर आप वेब या स्थानीय रूप से छवियों को लोड करने के लिए कोशिश कर रहे हैं, तो यह पूरी तरह से आपकी स्थिति पर लागू नहीं हो सकता है यकीन नहीं है, लेकिन मुझे उम्मीद है कि इस मदद करता है ...

0

आप यह बहुत ही कर सकते हैं बस रास्ता UIScrollView ऑब्जेक्ट बनाते समय सबसे पहले कतार बनाएं। आपके द्वारा बनाए जाने के बाद आप अपने स्थानीय संग्रहण से छवि को कतार के साथ अभी लोड कर सकते हैं।

//get a dispatch queue 
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 


//this will start the image loading in bg 
dispatch_async(concurrentQueue, ^{   
    NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL]; 

    //this will set the image when loading is finished 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     imageView.image = [UIImage imageWithData:image]; 
    }); 
}); 
संबंधित मुद्दे