2012-02-07 7 views
16

एप्लिकेशन मुख्य बंडल से छवियों को लोड करने का सबसे अच्छा तरीका क्या है। मैंएप्लिकेशन बंडल से छवियों को लोड करने का सबसे अच्छा तरीका

[UIImage imageNamed: "image.png"]; 

लेकिन मैंने सुना है कि यह स्मृति उपयोग और प्रदर्शन के मामले में अच्छा नहीं है। क्या कोई इस पर अपनी प्रतिक्रिया दे सकता है? मेरा आवेदन लॉन्च समय पर मुख्य बंडल से कई छवियां पढ़ता है। मैं इस प्रक्रिया को यथासंभव कुशल बनाना चाहता हूं।

बेस्ट सादर

+0

आपका मतलब है: '' [UIImage imageNamed: @ "image।पीएनजी "];' '' '' '' '' '' '' –

उत्तर

7

आप कैशिंग के बिना छवियों को लोड की कोशिश करना चाहते हैं, तो आप उपयोग कर सकते हैं:

[[UIImage alloc] initWithContentsOfFile:@"image.png"]; 

यह पहली बार छवि को लोड करने में थोड़ा तेज हो सकता है, क्योंकि इसे पहले इसे कैश नहीं करना पड़ता है। यदि आपको केवल इन छवियों को एक बार उपयोग करने की आवश्यकता है, तो शायद इसे इस तरह से आजमाने की समझ में आता है। इस तरह से ऐसा करने का अन्य लाभ यह है कि आपके पास आवश्यक से अधिक समय तक स्मृति का उपयोग करके छवि कैश नहीं होगा।

+0

लेकिन बहुत सारी छवियों के लिए यह सबसे अच्छा नहीं है रास्ता ...... –

+0

सवाल छवियों को लोड करते समय स्मृति उपयोग और प्रदर्शन के बारे में है, बंडल से छवि फ़ाइलों की सूची प्राप्त करने का सबसे अच्छा तरीका नहीं है। अगर उसके पास बहुत सारी छवियां हैं, तो उन्हें लोड करने का वैकल्पिक तरीका जो मैंने बेहतर प्रदर्शन प्रदान किया है, मैंने वर्णन किया है। – UIAdam

+0

यदि आप पूरे प्रश्न को ध्यान से पढ़ते हैं, तो आपको वह जवाब मिल जाएगा जो वह चाहता है। –

0

NSBundle

NSBundle* myBundle = [NSBundle mainBundle]; 

NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"]; 

का उपयोग कर एक भी संसाधन फ़ाइल खोजने के लिए और कई संसाधनों को खोजने के लिए:

NSBundle* myBundle = [NSBundle mainBundle]; 

NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg" 
           inDirectory:nil]; 
+0

भूल गया मैं यह नहीं देखता कि यह प्रश्न कैसे संबोधित करता है। – UIAdam

+0

हाय मैं छवि का पथ बनाने के लिए एक तंत्र खोजने की तलाश नहीं कर रहा हूं। कुछ ऐसा जो स्मृति उपयोग और प्रदर्शन को बेहतर बना सकता है जब मैं मुख्य बंडल से छवियों को लोड करता हूं। – Aqueel

+0

यानी मुझे पता है कि दूसरा विकल्प आपके पास एकाधिक छवियों के प्रदर्शन प्रदर्शन से संबंधित बेहतर तरीका है। –

13

यदि कोई सच्चा "सर्वश्रेष्ठ तरीका" था, तो छवियों को लोड करने के साधन कई तरीकों से मौजूद नहीं होंगे (जब तक ऐतिहासिक कारणों से नहीं)। इसलिए, एक छोटी समझ आपको "बेस्ट वे" के जवाब को दूर करने से बेहतर सेवा प्रदान करेगी।

+[UIImage imageNamed:] पुन: उपयोग के लिए छवि को कैश करता है, और यह अधिकांश उद्देश्यों के लिए एक समझदार डिफ़ॉल्ट है। कैशिंग उत्कृष्ट सही ढंग से उपयोग किया जाता है। कैश अच्छा है क्योंकि यह आपके द्वारा प्रदर्शित होने वाली प्रत्येक छवि के लिए प्रतिलिपि पढ़ने और आवंटित करने के बजाय, लोड की गई छवियों को साझा और पुन: उपयोग करके आपकी डिस्क को पढ़ने और स्मृति उपयोग को कम कर सकता है। एक आइकन छवि पर विचार करें जिसे आप एकाधिक स्क्रीन पर उपयोग करते हैं - क्या आप उस छवि डेटा को हर बार पढ़ और फिर से आवंटित करना चाहते हैं? इसके परिणामस्वरूप समान छवि डेटा के अनावश्यक पठन और आवंटन हो सकते हैं। यदि नहीं, तो कैशिंग विधियों का उपयोग करें।

यदि आप छवि को केवल एक बार और आलसी लोड करते हैं, तो आप गैर-कैशिंग दृष्टिकोण पर विचार करना चाहेंगे।

  • छवि डेटा बहुत सारी मेमोरी का उपभोग कर सकता है।
  • एक छवि को पढ़ने में काफी समय लग सकता है - न केवल डिस्क I/o, बल्कि इसे उपयोग करने योग्य UIImage प्रतिनिधित्व (जैसे छवि को डिकंप्रेस करना) में परिवर्तित करना।
  • ऐसे समय भी हैं जहां आपको छवि का आकार बदलना/स्केल करना चाहिए। तो आप एक स्केल की गई प्रतिलिपि चाहते हैं।

संक्षेप में, कई विचार हैं, लेकिन यदि आपने उचित रूप से स्केल की गई संपत्तियों का उपयोग किया है, तो कैशिंग आमतौर पर सही विकल्प है।

यदि आपकी संपत्ति ठीक से आकार में नहीं है, तो समस्या अधिक मौलिक है - यदि आप प्रदर्शन समस्याओं का सामना कर रहे हैं तो आपको उद्देश्य के लिए उपयुक्त होने के लिए बंडल संपत्तियों का आकार बदलना चाहिए। सर्वोत्तम छवि गुणवत्ता को बनाए रखने के दौरान उचित रूप से आकार की छवियां भी ड्राइंग को काफी सरल बनाती हैं।

+0

धन्यवाद जस्टिन। हाँ, यही कारण है कि मैं छवियों को लोड करने का सबसे अच्छा तरीका चाहता हूं। मेरे ऐप को इन छवियों को संसाधित करते समय बहुत समय लगता है, इसलिए मैं सोच रहा था कि क्या मैं अपना कोड सुधार सकता हूं। – Aqueel

+0

@Aqueel मैंने अभी उचित आकार का उपयोग करके कवर का जवाब संपादित किया है - एक नज़र डालें। – justin

+1

जस्टिन, आपकी प्रतिक्रिया वास्तव में सहायक थी। मैं लगभग 15 बड़े आकार की छवियों का उपयोग कर रहा था और उपयोग करने से पहले उन्हें स्केल कर रहा था जिसे मैं अभी ठीक कर दूंगा। धन्यवाद एक बार फिर ... – Aqueel

10
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:filePath]; 
संबंधित मुद्दे