IPhone UITableView स्क्रॉलिंग प्रदर्शन में सुधार के लिए ट्रिक्स?


89

मेरे पास एक यूएट्यूव्यू है जो प्रत्येक सेल में काफी बड़ी छवियों को लोड करता है और छवि के आकार के आधार पर सेल ऊंचाइयों में भिन्नता है। स्क्रॉलिंग प्रदर्शन सभ्य है, लेकिन कभी-कभी झटकेदार हो सकता है।

मैं इन सुझावों मैं FieryRobot ब्लॉग पर मिला पाया:

बेजान-स्क्रॉलिंग-UITableView साथ

अधिक-बेजान-स्क्रॉलिंग-UITableView साथ

किसी को भी uitableview स्क्रॉल प्रदर्शन में सुधार के लिए कोई सुझाव है?


यदि आपको सेल ऊंचाइयों को कैश करने की आवश्यकता है (जो गणना करने के लिए महंगा हो सकता है और अक्सर उपयोग किया जाता है), तो मैंने एक उदाहरण दिया है। यदि यह आपके आवेदन में उपयुक्त है तो ही इसका उपयोग करें। stackoverflow.com/questions/1371223/…
पॉल डे लैंग

जवाबों:


156
  1. पंक्तियों की ऊंचाई कैश करें (तालिका दृश्य बार-बार यह अनुरोध कर सकती है)
  2. तालिका में उपयोग की जाने वाली छवियों के लिए कम से कम हाल ही में उपयोग किया गया कैश बनाएं (और मेमोरी चेतावनी मिलने पर सभी निष्क्रिय प्रविष्टियों को अमान्य करें)
  3. में सब कुछ ड्रा UITableViewCellकी drawRect:अगर हर हालत में संभव से बचने के subviews (या आप मानक पहुँच कार्यक्षमता की आवश्यकता होती है, सामग्री को देखने केdrawRect: )
  4. अपना बनाएं UITableViewCell परत को अपारदर्शी (यदि आपके पास एक है तो सामग्री को देखें)
  5. के रूप में सिफारिश की पुन: प्रयोज्यCellIdentifier कार्यक्षमता का उपयोग करें UITableViewउदाहरणों / दस्तावेज़ीकरण
  6. बचें ढ़ाल / जटिल चित्रमय प्रभाव में है कि नहीं पहले से पके हुए कर रहे हैं UIImageरों

5
इसके अतिरिक्त, डाउनलोड की गई छवियों को सेल पर प्रदर्शित करने से पहले इमेज व्यू के आकार तक बढ़ा दिया जाना चाहिए!
ज़ोल्टन मटोक

4
मैं इस जवाब को अपने पिछले कुछ वर्षों के अनुभवों से जोड़ना चाहूंगा - पारदर्शी कोशिकाओं का होना शायद खराब स्क्रॉल प्रदर्शन का कारण नहीं है। हम बहुत जटिल कोशिकाओं (20+ साक्षात्कार) के साथ एक app है और यह पृष्ठभूमि दिखाने के लिए सभी पारदर्शी है। उचित अनुकूलन के साथ एक 3GS पर भी पारदर्शिता पर कोई फर्क नहीं पड़ता। वास्तव में वह चीज जो सबसे नीचे सामान को धीमा कर देती थी, वह टेबल लोडिंग से हटने के लिए पर्याप्त सेल होने से पहले नीब लोडिंग थी। यदि सबव्यू का उपयोग करते हैं, तो बस कुशल पदानुक्रम सुनिश्चित करें और आपको ड्राअर का उपयोग करने की आवश्यकता नहीं है।
Accatyyc

@Accatyyc, ऐसा लगता है कि मुझे भी यही समस्या है। वहाँ एक छोटा सा अंतराल है जब वहाँ पर्याप्त कोशिकाओं को नष्ट करने के लिए नहीं है, जब 3-4 कोशिकाओं को हटा दिया जाता है तब स्क्रॉल चिकना होता है। क्या कोशिकाओं को प्रीलोड करने का कोई तरीका है ताकि स्क्रॉल करते समय NIB फ़ाइलों को लोड न करने के लिए सेल हों?
तैयो जूल

@ टियोइस ज़रूर है। आपको पुरानी कोशिकाओं को हटाने के पुराने तरीके का उपयोग करने की आवश्यकता है (वर्गों / nibs को पंजीकृत न करें, लेकिन यदि dequeueCellWithIdentifier: रिटर्न एनआईएल) बनाएं तो उन्हें बनाएं। इस तरह आप अपने टेबल व्यू से पहले ही कोशिकाओं का एक सेट बना सकते हैं, उदाहरण के लिए उनमें से 20 को बनाने से पहले। इसके बजाय cellForRowAtIndexPath में नए बनाने के लिए :, आप उन्हें अपने कैश से पहले खींच लें, जब तक कि यह खाली न हो।
Accatyyc

मैं UICollectionView का उपयोग कर रहा हूं और उसी मुद्दे का सामना कर रहा हूं। मेरे कस्टम सेल निब फ़ाइल में। मैं वर्टिकल UIstackView के अंदर UIwebView और UIImageView सहित कई सबव्यू का उपयोग कर रहा हूं। जब मैं अपनी सूची को पुन: उपयोग करता हूं तो पुन: उपयोग की गई कोशिकाओं को उनके आकार को फिर से पढ़ने के लिए महत्वपूर्ण समय लगता है और स्क्रॉल बहुत झटकेदार लगते हैं।
मानसु ....

40
  1. यदि आप उपवर्ग कर रहे हैं UITableViewCell, तो एक निब का उपयोग न करें, इसे कोड में लिखें। यह निब फ़ाइलों को लोड करने की तुलना में बहुत तेज़ है।
  2. यदि आप छवियों का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप उन्हें कैशिंग कर रहे हैं ताकि आपको प्रत्येक के लिए एक से अधिक बार फ़ाइल से लोड न करना पड़े (यदि आपके पास मेमोरी है - आपको आश्चर्य होगा कि अंतरिक्ष की छवियां कितनी अधिक हैं)।
  3. संभव के रूप में कई तत्वों को अपारदर्शी बनाओ। इसी तरह, पारदर्शिता के साथ छवियों का उपयोग न करने और उपयोग करने की कोशिश करें।

3
चिंता मत करो ... कि ट्रोल थे। बहुत बढ़िया जवाब!
स्टीवा

79
डाउन वोट शायद इसलिए थे क्योंकि "निब से बचें" प्रदर्शन में सुधार के लिए बुरी सलाह है। यदि आप कोशिकाओं का पुन: उपयोग कर रहे हैं, तो सेल स्क्रॉल करते समय nibs से पुनर्निर्मित नहीं होते हैं।
स्टीवन फिशर

6
Nibs गति के समतुल्य हैं, या कोको पर लव रिसर्च के आधार पर थोड़ा तेज है। cocoawithlove.com/2010/03/…
MaxGabriel

@ निब का उपयोग करते हुए फिशर धीमा हो सकता है जब टेबल एलोक्स और डीललॉक्स कोशिकाएं, उदाहरण के लिए - तेज स्क्रॉलिंग के दौरान।
ध्वनि विस्फ़ोटक

3
जब सेल का निर्माण किया जा रहा हो तो एनआईबी का उपयोग धीमा हो सकता है । यदि आप सेल रीसाइक्लिंग का उपयोग कर रहे हैं, तो स्क्रीन को भरने के लिए केवल पर्याप्त सेल आवंटित किए गए हैं; कहते हैं, शायद 10 सबसे अधिक। जब आप स्क्रॉल कर रहे होते हैं, तो सेल नहीं बनते हैं। वे केवल पुन: उपयोग किए जाते हैं , डील-डौल और वास्तविक नहीं होते हैं। और, ज़ाहिर है, वहाँ कोई लागत नहीं है। तो नहीं, यह सही नहीं है।
स्टीवन फिशर

34

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

तेजी से स्क्रॉल-इन-Tweetie-साथ-UITableView

इसके अलावा, Apple ने अपने TableViewSuite ट्यूटोरियल्स में TableView के लिए अपना स्वयं का नमूना कोड अपडेट किया है (हो सकता है कि इसके जवाब में?)

TableViewSuite


1
यह एक भयानक समाधान है। मैं बस उत्सुक हूं कि मैं सेल दृश्य में एक UIButton कैसे जोड़ूंगा? क्या इसे ड्राअरक्ट मेथड में खींचा जा रहा है?
सुक्खा उदुगमसूरिया

1
@ बीनो, आपका लिंक टूट गया है (पहले वाला) मूल लेख पर हमारे हाथ लगाने का कोई मौका?
प्रेषि।

3
मूल लेख यहां पढ़ा जा सकता है: web.archive.org/web/20100922230053/http://blog.atebits.com/2008/…
jverdi

मूल संस्करण के रूप में वेब आर्काइव के लिए जोड़ा गया लिंक मौजूद नहीं है
राल्फ विल्गॉस

1

UITableView स्क्रॉलिंग के लिए # 1 परफॉर्मर किलर किसी भी सेल व्यू लेयर पर शैडो ड्रॉ कर रहा है, इसलिए यदि स्क्रॉलिंग परफॉर्मेंस मायने रखती है तो तब तक शैडो न करें जब तक कि यह मूल रूप से आपके मुख्य धागे को धीमा न कर दे।

सोचा कि यह कहा जाना चाहिए था क्योंकि स्वीकृत उत्तर में से कोई भी छाया और परतों का उल्लेख नहीं करता था। : +)


6
यदि समस्याएँ हैं, तो छाया में कोड की दो पंक्तियाँ शामिल हैं और सभी पूरी तरह से स्वयं का काम करती हैं। लेयर .shouldRasterize = YES; self.layer.rasterizationScale = UIScreen.mainScreen.scale;
पेड्रो रोमियो

0

UITableViewस्क्रॉलिंग प्रदर्शन के साथ किसी भी समस्या को अन्य उत्तरों में पहले से वर्णित तकनीकों का उपयोग करके हल किया जा सकता है। हालाँकि कई बार सुस्त प्रदर्शन स्वाभाविक रूप से गलत या दोहराव के कारण होता है।

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

  1. डेटा स्रोत में डेटा लोड करें - REST / डेटाबेस से। यह कदम पृष्ठभूमि पर होना चाहिए, अंततः जीसीडी कतार के साथ डिस्पैच_सुंक का उपयोग करना चाहिए।
  2. प्रासंगिक डेटा मॉडल ऑब्जेक्ट बनाएं और आरंभ करें और उन्हें एक सरणी के अंदर रखें
  3. [tableView reloaddata]
  4. अंदर cellForRowAtIndexPath, कोड शामिल करें जो सरणी के सही डेटा मॉडल ऑब्जेक्ट से डेटा (पाठ) सेट करेगा।
  5. अब चित्र शायद URL के रूप में भी हो सकते हैं, इसलिए यह चरण तालिका दृश्य द्वारा किए गए सेल पुन: उपयोग के कारण थोड़ा विचित्र हो सकता है। इस तथ्य का दिल एक बार फिर async कतार का उपयोग करके डिवाइस कैश / URL से छवि को लोड करने के लिए है, फिर इसे सही cell.image (जो भी आपकी सेल छवि संपत्ति है) को सेट करें।

समस्याओं से बचने के लिए, तालिका दृश्य के अंदर छवियों के आलसी लोडिंग के बारे में इस ट्यूटोरियल को देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.