2013-10-01 11 views
7

मेरे पास एक UICollectionView है जो वेब से पुनर्प्राप्त छवियों को दिखाता है। वे एसिंक्रोनस डाउनलोड कर रहे हैं।कोशिकाओं की एक बड़ी श्रृंखला को प्रीलोड करने के लिए UICollectionView को कैसे बताना है?

जब उपयोगकर्ता तेज़ी से स्क्रॉल करता है, तो वे सेल लोड होने तक प्लेसहोल्डर्स देखते हैं। ऐसा लगता है कि UICollectionView केवल वही लोड करता है जो दिखाई देता है।

क्या "संग्रह दृश्य, 20 से अधिक कोशिकाओं को ऊपर और नीचे लोड करने का कोई तरीका है" तो क्या संभावना अधिक है कि यह अधिक सेल लोड करता है जबकि उपयोगकर्ता स्क्रॉल किए बिना सामग्री को देख रहा था?

+0

एक तरीका जिस तरह से मैं सोच सकता हूं कि UICollectionView को वास्तव में दृश्य भाग (कुछ मुखौटा या उससे कम के नीचे छिपा हुआ) से बड़ा बनाना है। लेकिन यह निश्चित रूप से इष्टतम समाधान नहीं है :) –

+0

लेकिन चूंकि आपका डेटा असीमित रूप से लोड हो गया है: हो सकता है कि यह संग्रहदृश्य नहीं है लेकिन डेटा स्रोत समस्या ... –

+0

आपके संग्रह में आपके पास छवियां कैसे हो सकती हैं, क्योंकि यदि आप सभी छवियों को लोड करते हैं एक ही समय में आप एक स्मृति चेतावनी –

उत्तर

2

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

मान लें कि आपका संग्रह खड़ी है चलो, हालत के बारे में आप जानना चाहते है, जब:

BOOL topLoad = scrollView.contentOffset.y < M * scrollView.bounds.size.height 

या जब

BOOL bottomLoad = scrollView.contentOffset.y > scrollView.contentSize.height - M * scrollView.bounds.size.height 
दूसरे शब्दों में

, जब हम से एम "पृष्ठ" कर रहे हैं सामग्री के किनारे। अभ्यास में हालांकि, यह स्थिति अधिक ट्रिगर हो जाएगी, जैसे कि जब आप पहली बार लोड हो रहे हों, या यदि आप इसे scrollViewDidScroll पर परीक्षण कर रहे हैं, तो आप उपयोगकर्ता स्क्रॉलिंग के प्रत्येक पिक्सेल के लिए वेब अनुरोध जेनरेट नहीं करना चाहते हैं।

इसे सही प्राप्त करने के लिए, दृश्य नियंत्रक में अतिरिक्त स्थिति की आवश्यकता है। वीसी में बूल की एक जोड़ी हो सकती है, जैसे topLoadEnabled, bottomLoadEnabled, जो दृश्य तैयार होने तक नहीं हैं। फिर, प्रतिनिधि कोड को स्क्रॉल करें इस तरह दिखता है:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    // compute topLoad and bottomLoad conditions 
    if (topLoad && self.topLoadEnabled) [self startTopLoad]; 

इसी तरह नीचे के लिए। लोड कोड इस तरह दिखता है, संक्षेप में:

self.topLoadEnabled = NO; // don't trigger more loading until we're done 
[self.model getMoreTopStuff:^(NSArray *newStuff, NSError *error) { 

    // do view inserts, e.g. tableView.beginUpdates 
    self.topLoadEnabled = YES; 
}]; 

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

आशा है कि यह समझ में आता है।

0

एक बॉल ध्वज शायद ही कभी जवाब है। मैं एक उचित पृष्ठ आकार का अनुमान लगाने और cellForItemAtIndePath विधि से आवश्यक छवियों को लाने के लिए जाना चाहूंगा।

0

मेरी राय में आप गलत धारणा कर रहे हैं: कोशिकाएं केवल विचार हैं इसलिए आपको उन्हें मॉडल ऑब्जेक्ट्स के रूप में नहीं मानना ​​चाहिए। UICollectionView और UITableView बहुत कुशल हैं क्योंकि वे लगातार कोशिकाओं को रीसायकल करते हैं ताकि आपको चीजों के व्यावसायिक पक्ष में पूर्व लोडिंग सामग्री के थर्म में सोचना चाहिए। इंटरैक्टर या व्यूमोडेल ऑब्जेक्ट्स बनाएं और उन लोगों के साथ अपने डेटा स्रोत को पॉप्युलेट करें, फिर आप उन ऑब्जेक्ट्स को प्रीलोड लोड करने में सक्षम होंगे, अगर आप अभी भी ऐसा करना चाहते हैं।

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

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