Intereting Posts
छवि को मेटाडेटा को लागू करने के कारण परिवर्तन को विफल करने का अनुरोध करता है मेरे ऐप में पासबुक से पास कैसे पहुंचा जा सकता है? IPhone में ईवेंट कॉल करें आईओएस पर एईएस जीसीएम का उपयोग कैसे करें? XCode 7 के साथ तैनात एप को चलाने से क्रैश हो जाता है Xcode गलत आईपीए फ़ोल्डर संरचना बनाता है UIWebView में कुकीज़ कैसे एक जांच करता है कि UIWebView खाली है या नहीं संपूर्ण तालिकादृश्य को एक छवि के रूप में कैप्चर कैसे करें, उसमें से। पीडीएफ बनाएं और उसे ईमेल करें BLE पृष्ठभूमि फिर से कनेक्ट करें किसी ऐप के भीतर मूल आईओएस कॉकस का उपयोग करें क्या iOS CarPlay API सार्वजनिक है? कैसे CarPlay एकीकृत करने के लिए? आईओएस – यूआईवीयूव एनिमेट में पूर्णता वाला ब्लॉग्जविथडिअलेशन को बहुत जल्दी कहा जाता है कोड साइन एरर – कमांड / यूएसआर / बिन / कोडेसिन असफल कोड 1 के साथ विफल JSON आउटपुट लहजे का मुद्दा

तालिका दृश्य स्क्रॉलिंग एसिंक

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

मैं इन छवियों को दस्तावेज़ निर्देशिका से लोड कर रहा हूँ। कैसे इस प्रक्रिया को गति के लिए कोई सुझाव या विचार?

संशोधित कोड संपादित करें:

Beer *beer = (Beer *) [self.fetchedResultsController objectAtIndexPath:indexPath]; cell.displayBeerName.text = beer.name; // did we already cache a copy of the image? if (beer.image != nil) { // good. use it. this will run quick and this will run most of the time cell.beerImage.image = beer.image; } else { // it must be the first time we've scrolled by this beer. do the expensive // image init off the main thread cell.beerImage.image = nil; // set a default value here. nil is good enough for now [self loadImageForBeer:beer atIndexPath:indexPath]; } - (void)loadImageForBeer:(Beer *)beer atIndexPath:(NSIndexPath *)indexPath { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ UIImage *image = [UIImage imageWithContentsOfFile:beer.imagePath]; beer.image = image; dispatch_sync(dispatch_get_main_queue(), ^{ UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; cell.beerImage.image = image; }); }); } 

Solutions Collecting From Web of "तालिका दृश्य स्क्रॉलिंग एसिंक"

आपका एल्गोरिदम बहुत अच्छा लग रहा है आप कई ठेठ नुकसान से बचा है यदि आप अभी भी UI कार्यक्षमता समस्याएं रखते हैं, तो मैं कुछ चीजों का सुझाव देता हूं:

  1. आपको स्मृति में अपनी छवियों को कैशिंग करने की कोशिश करनी चाहिए आप NSMutableArray या NSMutableDictionary उपयोग कर सकते हैं, लेकिन आईओएस एप पर छवियों को कैश करने का सबसे अच्छा तरीका है? कालेब NSCache वर्ग के गुणों की चर्चा करता है, जो इस प्रक्रिया को सरल करता है। यदि आप कैश छवियाँ करते हैं, तो सुनिश्चित करें कि आप मेमोरी दबाव का जवाब देते हैं और यदि आवश्यक हो तो कैश को मिटा दें। आप didReceiveMemoryWarning जवाब दे सकते हैं या अधिसूचना केंद्र के UIApplicationDidReceiveMemoryWarningNotification लिए खुद को पर्यवेक्षक के रूप में जोड़ सकते हैं।

  2. सुनिश्चित करें कि आपकी कैश की गई छवियाँ थंबनेल आकार की हों या फिर आप अपने यूआई में हमेशा थोड़े बड़बड़ाते रहें (यदि आपको एक रीसाइज़िंग एल्गोरिदम चाहिए, तो हमें बताएं) और यह अनावश्यक रूप से स्मृति का उपयोग करेगा;

  3. जब आप अपनी छवि अपडेट मुख्य कतार में वापस भेजते हैं, तो आपको ऐसा अतुल्यकालिक तरीके से करना चाहिए (उस पृष्ठभूमि कतार को चारों ओर क्यों घूमना है और संसाधनों को बांधना है क्योंकि ब्लॉक को समाप्त करने के लिए मुख्य कतार में वापस भेजा जा रहा है … यह एक विशेष रूप से एक समस्या है जब आपके पास एक पटकथा के दौरान बैक अप चित्रों की एक जोड़ी है); तथा

  4. जब आप मुख्य कतार में वापस भेजते हैं, तो आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि सेल आपको सेल से मिलता है। cellForRowAtIndexPath nil नहीं है (क्योंकि अगर सेल लोडिंग लॉक का भी बैक अप हो जाता है (धीमी डिवाइस पर विशेष), तो आप सैद्धांतिक रूप से सवाल वाले सेल को स्क्रॉल कर सकते हैं स्क्रीन से और आपके एल्गोरिथ्म को क्रैश हो सकता है)।

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

यदि आपको अभी भी परेशानी हो रही है, तो सीपीएल प्रोफ़िलर बाधाओं को पहचानने के लिए बहुत अच्छा है और आपको यह बताएगा कि आपको अपना ध्यान किस स्थान पर केंद्रित करना चाहिए। कुछ महान WWDC सत्र ऑनलाइन उपलब्ध हैं जो प्रदर्शन बाधाओं की पहचान करने के लिए उपकरणों का उपयोग करने पर ध्यान केंद्रित करते हैं, और मुझे लगता है कि उपकरण के साथ दक्षता हासिल करने के लिए उन्हें बहुत मददगार साबित होते हैं।

यहाँ मेरा कोड है viewDidLoad , मैं अपनी छवि कैश को इनिशियलाइज़ करता हूं:

 - (void)initializeCache { self.imageCache = [[NSCache alloc] init]; self.imageCache.name = @"Custom Image Cache"; self.imageCache.countLimit = 50; } 

और फिर मैं इसे अपने tableView:cellForRowAtIndexPath में tableView:cellForRowAtIndexPath हूं tableView:cellForRowAtIndexPath :

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"ilvcCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // set the various cell properties // now update the cell image NSString *imagename = [self imageFilename:indexPath]; // the name of the image being retrieved UIImage *image = [self.imageCache objectForKey:imagename]; if (image) { // if we have an cachedImage sitting in memory already, then use it cell.imageView.image = image; } else { cell.imageView.image = [UIView imageNamed:@"blank_image.png"]; // the get the image in the background dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // get the UIImage UIImage *image = [self getImage:imagename]; // if we found it, then update UI if (image) { dispatch_async(dispatch_get_main_queue(), ^{ // if the cell is visible, then set the image UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; if (cell) cell.imageView.image = image; [self.imageCache setObject:image forKey:imagename]; }); } }); } return cell; } 

तथा

 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; [self.imageCache removeAllObjects]; } 

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

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

कुछ चीजें:

सबसे पहले, ध्यान से सावधानी बरतें, साथ-साथ सांत्वनाओफ़फ़ाइल, यह कुछ भी कैश नहीं करेगा। जब भी आप इमेज को लोड करते हैं तो हर बार जब आप इमेज को लोड करते हैं, तो -इमेज नामित होने के कारण कुछ कैश में छवि को गर्म रखना होगा। आप निश्चित रूप से अपने डोमेन ऑब्जेक्ट में कैश कर सकते हैं, लेकिन मैं व्यक्तिगत रूप से इसके विरुद्ध दृढ़ सलाह देता हूं। आपकी मेमोरी पदचिह्न छत के माध्यम से जा रहा है, जिससे आपको अपना कैश एक्सपरेसन तंत्र लागू करने में मजबूर किया जा रहा है, जबकि ऐप्पल के माध्यम से इमेज नामक एक बहुत अच्छी छवि कैश है। मुझे आश्चर्य होगा अगर आप सभी उपकरणों के 3 परिवारों पर सेब की तुलना में बेहतर काम कर सकते हैं 🙂

उसके बाद, आप UITableView के फ्लायवेट पैटर्न को तोड़ रहे हैं:

 dispatch_sync(dispatch_get_main_queue(), ^{ cell.beerImage.image = image; beer.image = image; [cell setNeedsLayout]; }); 

ब्लॉक में सेल को कैद करने के बजाय किसी दिए गए इंडेक्स में सेल देने के लिए तालिका दृश्य से पूछें: जब छवि लोड हो जाती है, तो उस सेल इंस्टेंस को वास्तव में दूसरे इंडेक्स पथ के लिए पुन: उपयोग किया जा सकता है, और आप गलत सेल में छवि

और -सेंट नेड्स के लिए कोई ज़रूरत नहीं है, यहां पर बस चित्र बदलना पर्याप्त है

संपादित करें: वूप्स! मैं मेज दृश्य में छवियों के साथ स्पष्ट बात याद किया आपकी छवियों का आकार क्या है, छवि का आकार क्या है और छवि पर सामग्री मोड क्या है? यदि आपकी छवियों छवि दृश्य की तुलना में एक बहुत अलग आकार के हैं और आप छवि का आकार बदलने के लिए कह रहे हैं, तो यह मुख्य थ्रेड पर होगा और आप वहां एक बड़े प्रदर्शन को प्रभावित करेंगे। लोड करने के बाद, छवि दृश्य बंद धागा में छवि का आकार बदलें (एक त्वरित Google खोज आपको ऐसा करने के लिए कोर ग्राफिक्स कोड देगा)।

गायब छवि के साथ मॉडल को अपडेट करने के लिए अनुपलब्ध कदम है। वैसे भी, हर बार हर सेल के लिए आप नए लोड कर रहे हैं मॉडल अपेक्षाकृत महंगी भार के परिणाम को कैश करने के लिए सही जगह है। क्या आप बीयर.इमेज संपत्ति जोड़ सकते हैं?

उसके बाद, आपका कॉन्फ़िग कोड ऐसा दिखेगा:

 Beer *beer = (Beer *) [self.fetchedResultsController objectAtIndexPath:indexPath]; cell.displayBeerName.text = beer.name; // did we already cache a copy of the image? if (beer.image != nil) { // good. use it. this will run quick and this will run most of the time cell.beerImage.image = beer.image; } else { // it must be the first time we've scrolled by this beer. do the expensive // image init off the main thread cell.beerImage.image = nil; // set a default value here. nil is good enough for now [self loadImageForBeer:beer atIndexPath:indexPath]; } 

स्पष्टता के लिए लोडर तर्क को यहां ले जाया गया …

 - (void)loadImageForBeer:(Beer *)beer atIndexPath:(NSIndexPath *)indexPath { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ UIImage *image = [UIImage imageWithContentsOfFile:beer.imagePath]; beer.image = image; dispatch_sync(dispatch_get_main_queue(), ^{ UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; cell.beerImage.image = image; }); }); } 

आप इस प्रश्न को देख सकते हैं, पहले स्टैक अतिप्रवाह पर उत्तर दिया था।

UITViewcell slowdowns स्क्रॉलिंग तालिका में UIImage

या फिर इस कोड का प्रयास करें

 - (void)configureCell:(BeerCell *)cell atIndexPath:(NSIndexPath *)indexPath { Beer *beer = (Beer *) [self.fetchedResultsController objectAtIndexPath:indexPath]; cell.displayBeerName.text = beer.name; UIImage *image = [UIImage imageWithContentsOfFile:beer.imagePath]; cell.beerImage.image = image; [cell setNeedsLayout]; }