2012-06-23 11 views
6

मैं पिछले कुछ दिनों में एक रहस्य को हल करने का प्रयास कर रहा हूं कि क्यों मेरे एनएसएफटेड रीसेट्स कंट्रोलर 20 के बैच आकार के साथ हमेशा मेरी सभी ऑब्जेक्ट्स में (यानी, स्मृति में लोड) जब fetch समाप्त हो गया, अनुरोध ~ 20 सेकंड लेने का कारण बन गया।कोर डेटा ऑब्जेक्ट्स के साथ गतिशील UITableView ऊंचाई

यह पता चला है कि ऐसा इसलिए था क्योंकि मेरी ऊंचाई में ForRowAtIndexPath, ऊंचाई प्रत्येक प्राप्त वस्तु की एनएसएसटींग संपत्ति की लंबाई पर आधारित थी, और इसलिए तालिका को फिर से लोड करने पर, यदि तालिका में 2000 पंक्तियां हैं, तो ऊंचाई की गणना की जाती है शुरुआत में प्रत्येक पंक्ति के लिए, और जब से मैं ऑब्जेक्ट की टेक्स्ट प्रॉपर्टी एक्सेस करता हूं, तो यह बहुत ही शुरुआत में 2000 ऑब्जेक्ट्स (20 आकार बैचों में) में गलती करेगा, जिससे इसे हमेशा के लिए ले जाया जा सकता है। (मुझे नहीं पता था कि पंक्ति ऊंचाई की गणना शुरुआत में ही की गई थी)।

तो सवाल यह है कि, यदि मेरे पास 20 के बैच आकार के साथ एक परिणाम परिणाम नियंत्रक है, लेकिन मेरी पंक्ति ऊंचाई ऑब्जेक्ट की टेक्स्ट प्रॉपर्टी पर आधारित होती है, जो कि यदि मैं एक्सेस करने का प्रयास करता हूं तो ऑब्जेक्ट नहीं होगा अब एक गलती है लेकिन वास्तव में स्मृति में लोड किया गया है, ऊंचाई की गणना करने के लिए एक कामकाज क्या होगा?

मेरे विकल्प क्या हैं?

+0

क्या होता है यदि आप जांचते हैं कि ऑब्जेक्ट एक गलती है, यदि यह है, तो मनमानी आकार लौटाएं, अन्यथा स्ट्रिंग प्राप्त करें और गणना करें? क्या सेल देखने के लिए आता है जब विधि फिर से बुलाया जाता है? मैं बस अनुमान लगा रहा हूँ। आलसी भार को लागू करना या लागू करना (आईई नई पंक्तियों को स्क्रॉल करते समय जोड़ा जाता है) आपके एकमात्र विकल्प प्रतीत होते हैं। – jrturton

+0

कोई ऊंचाईफॉररो केवल एक रीलोड की शुरुआत में ही बुलाया जाता है, और जब भी कोई सेल दिखाई देता है (जैसे सेलफोररो होगा) को कॉल नहीं किया जाता है। यही मैं भी सोच रहा था, लेकिन मुझे नहीं लगता कि यह काम करेगा .. – Snowman

+0

सोचा था कि यह बहुत आसान लग रहा था। – jrturton

उत्तर

2

दिलचस्प सवाल। प्रदर्शन को बढ़ावा देने के लिए मैं क्या करूँगा आपके मॉडल में एक संपत्ति बनाना होगा जो उस स्ट्रिंग टेक्स्ट की लंबाई संग्रहीत करे। इस तरह आपको फ्लाई पर प्रत्येक पंक्ति के लिए लंबाई की गणना करने की आवश्यकता नहीं है लेकिन आपके पास पूर्व-गणना की ऊंचाई है।

माइबे अन्य मूल्यवान समाधान हो सकते हैं।

+0

लेकिन मुझे अभी भी उस पूर्णांक संपत्ति तक पहुंचने की आवश्यकता होगी, जिससे ऑब्जेक्ट अब गलती न हो और स्मृति में लोड हो जाए .. – Snowman

+1

@ मोहाबिटार यह बिल्कुल सही नहीं है। यदि आप उस प्रॉपर्टी को अपने fetch अनुरोध में प्रीफ़ेच करते हैं और फिर आप इसे एक्सेस करते हैं, तो स्ट्रिंग टेक्स्ट स्मृति में लोड नहीं होता है जब तक कि आप इसकी मांग नहीं करेंगे, अन्यथा टेक्स्ट प्रॉपर्टी गलती के रूप में रहेगी। –

+0

ठीक है, लेकिन जब मैं स्ट्रिंग प्रॉपर्टी तक पहुंचता हूं, तो ऑब्जेक्ट जो स्ट्रिंग धारण कर रहा है उसे स्मृति में लोड किया जाता है (क्योंकि यह पहले एक गलती थी, अनइंस्टैंटियेटेड।) – Snowman

-1

उस दृश्य ऊंचाई की गणना करने के प्रभारी आपके व्यू कंट्रोलर क्लास में एक स्थिर विधि बनाएं। आपको यह काम करने की ज़रूरत है, यह एक एनएसएसटींग है और इसे आसानी से गणना की गई CGFloat वापस करनी चाहिए। इन तत्वों को तत्काल किए बिना अपने तत्वों की आवश्यक ऊंचाई को वापस करने के लिए इस विधि का उपयोग करें (आपको केवल उनके टेक्स्ट का मेटा-डेटा चाहिए)।

+0

ठीक है, लेकिन विधि कैसे पता चलेगी कि एनएसएसटींग ऑब्जेक्ट्स को तत्काल किए बिना क्या है? NSString ऑब्जेक्ट की एक प्रॉपर्टी है, और यदि ऑब्जेक्ट एक गलती है, तो ऑब्जेक्ट को कॉल करना .textProperty ऑब्जेक्ट को स्मृति में लोड करने का कारण बनता है .. – Snowman

+0

यह समस्या आपके कार्यान्वयन से संबंधित है। शायद उदाहरणों के निर्माण के बिना इन तारों को प्राप्त करने के लिए एक कामकाज? यह चिकन और अंडे है :) – Stavash

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