2011-02-11 8 views
7

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

अधिकांश भाग के लिए, यह बहुत अच्छा काम करता है, सिवाय इसके कि मैंने व्यवहार में एक सूक्ष्म अंतर देखा है, इस नमूना ऐप के बीच, और वास्तविक ऐप स्टोर छवियों को कैसे डाउनलोड करता है।

यदि आप LazyTableImages नमूना लॉन्च करते हैं, तो त्वरित फ्लिक-स्क्रॉल डाउन करें, आप देखेंगे कि छवियां के बाद प्रदर्शित नहीं होती हैं, स्क्रॉलिंग पूरी तरह से बंद हो जाती है।

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

मैं इन परिणामों को प्राप्त करने की कोशिश कर रहा हूं, लेकिन अब तक मैं कोई प्रगति नहीं कर रहा हूं। क्या किसी को यह कैसे करना है इस पर कोई विचार है?

धन्यवाद!

उत्तर

10

मैं चकित कोई भी इस का जवाब दे कि हूँ ...

तो, मैं अंत में पता लगा कि आइकन को सटीक ही प्रभाव है कि वास्तविक app की दुकान में प्रयोग किया जाता है के संबंध में, प्राप्त करने के लिए कैसे डाउनलोड/प्रदर्शित होते हैं।

LazyTableImages नमूना प्रोजेक्ट लें और कुछ सरल संशोधनों को करें।

  1. रूट दृश्य नियंत्रक में जाकर के बारे में सभी चेक हटाने तालिका स्क्रॉल और/या cellForRowAtIndexPath में मंद

  2. loadImagesForOnScreenRows के लिए सभी कॉल निकालें, और इस तरह के रूप में अच्छी तरह से है कि विधि निकालने है।

  3. IconDownload.m में जाकर नहीं को startDownload पद्धति को बदलने एक async छवि downlaod करते हैं, लेकिन बजाय एक पृष्ठभूमि धागा पर एक समन्वयन डाउनलोड कर सकते हैं।startDownload में सभी कोड निकाल दें और निम्नलिखित जोड़ने के लिए, तो यह इस तरह दिखता है:

 

- (void)startDownload 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage) object:nil]; 

    [queue addOperation:operation]; 

    [operation release]; 
    [queue release]; 
} 
 

फिर, एक loadImage जोड़ने इस तरह:

 

- (void)loadImage 
{ 
    NSData *imageData = [[NSData alloc] initWithContents OfURL:[NSURL URLWithString:appRecord.imageURLString]]; 
    self.apprecord.appIcon = [UIImage imageWithData:imageData]; 
    [imageData release]; 

    [self performSelectorOnMainThread:@selector(notifyMainThread) withObject:nil waitUntilDone:NO]; 
} 
 

फिर, इस तरह notifyMainThread जोड़ने :

 

- (void)notifyMainThread 
{ 
    [delegate appImageDidLoad:self.indexPathInTableView]; 
} 
 

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

छवियां जैसे ही सेल प्रदर्शित होने के लिए तैयार हो जाती हैं, छवियां डाउनलोड की जाती हैं, और छवि डाउनलोड होने के तुरंत बाद प्रदर्शित होती है।

कोई लेखन त्रुटि के लिए क्षमा करें, मैं वैसे भी मेरी ऐप्लिकेशन से इस पेस्ट नहीं किया, मैं इसे में टाइप, के बाद से मैं अभी से अपने मैक दूर हूँ ...

, मुझे आशा है कि यह आप सभी मदद करता है। ..

+0

शानदार! इसे पोस्ट करने के लिए धन्यवाद! –

+0

मैं ऐप्पल के उदाहरण को बेहतर बनाने के आपके प्रयास की सराहना करता हूं। आपका समाधान आंशिक रूप से काम करता है। स्क्रॉल प्रतिनिधियों को ** ** ** हटाया जाना चाहिए, या आपके व्यू कंट्रोलर को यह नहीं पता कि आइकन कब डाउनलोड करना है। 'LoadImagesForOnScreenRows' को 'viewDidLoad' या' viewDidAppear' में भी कॉल किया जाना चाहिए, उपयोग पर निर्भर करता है। – Raptor

+0

अच्छा, लेकिन यह पूरे नमूना कोड को बदलता है। यह अब NSURL कनेक्शन का उपयोग नहीं करता है। – yosh

0

UIScrollViewDelegate देखें। मैंने scrollViewDidScroll: को सुनकर इस तरह कुछ कार्यान्वित किया है, स्क्रॉल की गति की गणना (contentOffset को अंतिम दर्ज contentOffset के विरुद्ध, समय में अंतर से विभाजित) के विरुद्ध, और एक निश्चित दहलीज के नीचे गति गिरने के बाद छवियों को लोड करना शुरू कर दिया है। (आप UIScrollViewDelegate के scrollViewDidEndDragging:willDecelerate: के साथ कुछ भी प्राप्त कर सकते हैं)।

बेशक, आपको गति की जांच करने की आवश्यकता नहीं है; जब भी आप कोई नया सेल देखते हैं, तो आप UITableViewDelegate के tableView:willDisplayCell:forRowAtIndexPath: पर छवियों को लोड कर सकते हैं, लेकिन मुझे पता चला है कि यदि उपयोगकर्ता कई कोशिकाओं के माध्यम से फ़्लिप कर रहा है, तो आपको परेशान करने की आवश्यकता नहीं है जब तक कि आप यह न देख सकें कि वे धीमे होने जा रहे हैं ब्राउज़ करने के लिए नीचे।

+0

मैंने यह कोशिश की है। मैंने सत्यापित किया है कि नई प्रदर्शित आइटम छवियों को डाउनलोड करने के लिए कॉल तुरंत हो रहे हैं। हालांकि, कनेक्शनडिडफिनिश लोडिंग: स्क्रॉलिंग पूरी तरह से बंद होने तक कभी नहीं बुलाया जाता है। मैं वास्तव में इस व्यवहार से उलझन में हूं ... – bpatrick100

+0

नमूना ऐप व्यवहार का वर्णन करने का एक और तरीका यह है कि यदि आप सूची को स्वाइप करते हैं, लेकिन अपनी अंगुली को जारी न करें (इसे स्क्रीन पर रखें), तो आप देखेंगे कि छवियां प्रदर्शित नहीं होती हैं। फिर, जैसे ही आप अपनी उंगली छोड़ते हैं, छवियां प्रदर्शित होंगी। यह एकल थ्रेडेड व्यवहार की तरह लगता है। मुझे आश्चर्य है कि क्या यह पूरी समस्या है। मुझे आश्चर्य है कि मुझे प्रत्येक छवि डाउनलोड कॉल को अपने स्वयं के थ्रेड पर स्पष्ट रूप से रखना होगा ... – bpatrick100

+0

यह आपके सभी डाउनलोड कॉल के लिए केवल एक थ्रेड आवंटित करने के लिए पर्याप्त होना चाहिए। सामान्य रूप से कनेक्शन के लिए, मैं ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) – kevboh

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