ios - क्या बुला व्यवहार UICollectionView.reloadData() बुला रहा है? यदि हां, तो क्यों?
cocoa-touch (4)
मैंने एक शानदार डेवलपर के साथ काम किया था, जो कि UICollectionView
पर UICollectionView
reloadData()
को कभी भी कॉल करने से इनकार UICollectionView
।
उन्होंने collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
View.reloadItemsAtIndexPaths collectionView.reloadItemsAtIndexPaths(collectionView.indexPathsForVisibleItems())
पर भी frowned, इसके बजाय एक सटीक सूचकांक पथ को पुनः लोड करने के लिए पसंद करते हैं, जिसे दृश्य अपडेट की आवश्यकता होती है।
मैंने उनसे इसे उठाया, लेकिन एक सामान्य reloadData()
द्वारा की जाने वाली समस्याओं के बारे में सोचने के लिए संघर्ष कर रहा हूं। बेशक, अगर आपके पास महंगे दुष्प्रभाव होते हैं जो एक पुनः लोड द्वारा शुरू हो जाते हैं, तो यह एक बात है। लेकिन अगर आपका डेटा स्रोत स्वयं ही बाहर लटके हुए है, तो संग्रह दृश्य को अपडेट करने के लिए आसान-पर-कोडिंग-पक्ष के रूप में क्यों नहीं पुनः reloadData()
?
इस अभ्यास के कारण क्या समस्याएं होंगी?
पुनः reloadItemsAtIndexPaths
और reloadItemsAtIndexPaths
केवल उन पंक्तियों के लिए कक्षों को पुनः बनाने और पुन: reloadItemsAtIndexPaths
करने का कारण reloadItemsAtIndexPaths
जिनके पास एक संबंधित दृश्यमान सेल है।
इसलिए, क्योंकि दृश्य कोशिकाओं की संख्या आम तौर पर बदलती नहीं है और आमतौर पर छोटे होते हैं (जैसे अधिकतम 5 से 20), आपके डेटा मॉडल में वस्तुओं की संख्या पर कोशिकाओं को प्रस्तुत करने के लिए समग्र काम हमेशा निरंतर और स्वतंत्र होता है।
पुनः reloadItemsAtIndexPaths
विरोध के रूप में, जो निर्दिष्ट दृश्यमान कोशिकाओं को चुनिंदा रूप से पुनः प्रदान करता है, पुनः reloadItemsAtIndexPaths
सभी वर्तमान दृश्यमान कोशिकाओं को अपडेट करेगा, और मॉडल की मदों की संख्या में बदल जाने पर अंतर्निहित और संबद्ध दृश्यों को भी अपडेट किया जाएगा (उदाहरण के लिए स्क्रॉलबार को एडजस्ट करना और दृश्य के हाइट )।
आप निष्पादन के कारणों के लिए reloadItemsAtIndexPaths
उपयोग कर सकते हैं - लेकिन आम तौर पर, यह आवश्यक नहीं है - और कई बार अनुशंसित नहीं हैं, क्योंकि इसके लिए आपको अपने कोड के अन्य स्थानों पर वस्तुओं की संख्या के बारे में भी ध्यान रखना होगा।
यह collectionView
के दृश्य में रीलोड विधि में नहीं है लेकिन Tableview
साथ एक ही मुद्दा मुझे नहीं पता कि आप tableview
और tableview
के पुनः लोड विधि के बारे में जानते हैं।
जब आप reload
पद्धति को कॉल करते हैं। ओएस सभी visible
सेल के लिए जांचें और सभी सेल के लिए cellForRow
विधि को कॉल करें इसका मतलब है कि आप कोड को अतिरिक्त काम करते हैं जो अनावश्यक हैं इसलिए यह केवल उन सेल को पुनः लोड करने के लिए पुनः लोड करने के लिए कॉल करने का सही तरीका है जो अपडेट करने की आवश्यकता है।
मान लीजिए कि आप 20 दृश्य सेल वाले collectionView
को देखें। cellForRow
विधि पर सेट की गई cellForRow
अब आप सेल 11 में इस छवि को अपडेट करना चाहते हैं। यदि आप पुनः लोड विधि कहते हैं तो cellForRow
हर सेल के लिए कॉल करेगी। लेकिन अगर आप reloadItemsAtIndexPaths
उपयोग reloadItemsAtIndexPaths
और केवल एक reloadItemsAtIndexPaths
करते हैं तो यह reloadItemsAtIndexPaths
केवल सेल 11 के लिए एक बार निष्पादित करेगा।
सामान्य अस्वीकार के रूप में, मुझे लगता है कि यह अतिशयोक्तिपूर्ण है यदि टेबल बड़ी है, तो कुछ प्रदर्शन फायदे होंगे, और यदि आइटम बनाने के लिए महंगे होंगे। यदि प्रति पंक्ति में आइटम की संख्या भिन्न हो सकती है, और आप 500 आइटमों में से आइटम # 317 पुनः लोड करते हैं, तो आप जानते हैं कि सभी पिछली पंक्तियों में आइटम्स की संख्या में कोई परिवर्तन नहीं हुआ है, इसलिए आपको उस पुनर्गणना की आवश्यकता नहीं है लेकिन अगर आपके पास केवल 20 आइटम हैं, तो यह आमतौर पर थोड़ा अंतर बनाता है
नहीं, यह बिल्कुल बुरा व्यवहार नहीं है।
सिर्फ एक संक्षिप्त अवलोकन, तो आप अपना जवाब मिलता है
UICollectionView अत्यधिक अनुकूलित है, और इस प्रकार केवल स्मृति पर ऑन-स्क्रीन दृश्यमान पंक्तियां रखता है अब, सभी पंक्तियां कक्ष पूल में कैश किए गए हैं और पुन: उपयोग किए गए हैं और पुनर्जन्म नहीं किए गए हैं। जब भी, उपयोगकर्ता यूआईकॉलक्विंज दृश्य स्क्रॉल करता है, यह पूल में सिर्फ-छिपी हुई पंक्तियां जोड़ता है और दृश्य पंक्तियों के बगल में उन्हें पुन: उपयोग करता है
इसलिए, जब आप पुनः लोडडेटा () को कॉल करते हैं, तो यह केवल पंक्ति कोशिकाओं में डेटा अपडेट करता है, जैसे यूआईएलएबल पाठ को अपडेट करना और अद्यतन केवल दृश्यमान कोशिकाओं के लिए होता है, और प्रक्रिया चालू होती है
अब, विचार करें कि आपके पास अपने संग्रह दृश्य में और कॉल करते समय दस पंक्तियां दिखाई देंगी
reloadItemsAtIndexPaths (collectionView.indexPathsForVisibleItems ())
आप केवल उन मदों के लिए तत्वों की तरह यूआईएलएबल अपडेट करते हैं, लेकिन अगर आप पुनः लोडडेटा () को कॉल करते हैं, तो आप दस दृश्यमान वस्तुओं के लिए डेटा अपडेट करते हैं, जो किसी भी अंतर को नहीं बनाते क्योंकि यह बहुत ही हल्का प्रक्रिया है।
आपको हर जगह पुनः लोडडेटा () का उपयोग करना चाहिए इसे सरल और पठनीय रखें निष्पादन के अनुसार, पुनः लोड आईटम्स में कोई अंतर नहीं होता है।
यह एप्पल डॉक्स में ठीक से विस्तारित है
इस दृश्य को संग्रह दृश्य में सभी आइटम पुनः लोड करने के लिए कॉल करें। इसके कारण संग्रह दृश्य किसी भी वर्तमान दृश्यमान आइटम को त्यागने और उन्हें फिर से दिखाता है। दक्षता के लिए, संग्रह दृश्य केवल उन कोशिकाओं और अनुपूरक दृश्य दिखाता है जो दृश्यमान हैं। यदि संग्रह डेटा पुनः लोड के परिणाम के रूप में घटाता है, तो संग्रह दृश्य इसके स्क्रॉलिंग ऑफ़सेट को तदनुसार समायोजित करता है।