2011-11-20 6 views
5

मैं एक ऐप बनाता हूं जो पहले लॉन्च पर कुछ डेटा एक्सेस करता है और फिर इसे प्रदर्शित करता है। मैं इस डेटा को इस तरह से डाउनलोड कर रहा हूं:ऐप लॉन्च करते समय DataWithContentsOfURL खराब है?

NSData *data = [NSData dataWithContentsOfURL:url]; 

क्या यह बुरा है? अभी मैंने उस विधि को सेट किया है जिसमें जीसीडी का उपयोग करके पृष्ठभूमि थ्रेड में चलाने के लिए यह शामिल है, लेकिन मैंने सुना है कि dataWithContentsOfURL सिंक्रोनस है, यह खराब है। क्या इस पर कोई राय है?

+0

@bryanmac कृपया ऐप्पल जीसीडी प्रश्नों के लिए ग्रैंड-सेंट्रल-प्रेषण टैग का उपयोग करें। –

उत्तर

5

यदि आप इसे मुख्य यूआई थ्रेड पर चलाते हैं तो यह बुरा है। इससे आपके ऐप की प्रतिक्रिया को अवरुद्ध कर दिया जाएगा जो खराब है लेकिन स्टार्ट अप पर यह भी बदतर है।

आपको इसे एसिंक बनाने की आवश्यकता है। आप पृष्ठभूमि थ्रेड (जीसीडी dispatch_async) पर या उस विधि को NSUrlConnection के async विधियों का उपयोग करके उस विधि को चलाकर कर सकते हैं।

यहाँ पृष्ठभूमि में काम करने के लिए और उसके बाद अद्यतन मुख्य थ्रेड पर यूआई (के बाद किया) GCD का उपयोग करने का एक उदाहरण है:

GCD, Threads, Program Flow and UI Updating

एक अन्य विकल्प NSURLConnection का async तरीका है। initWithRequest तरीकों यहाँ देखें:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

+0

जीडीसी का उपयोग कर पृष्ठभूमि धागे में इसे चलाकर, क्या यह एक समस्या होगी? – Yep

+0

अभी संपादित - आप जीसीडी के साथ चला सकते हैं। मैं कुछ पॉइंटर्स जोड़ूंगा। – bryanmac

+1

मैंने इसे इस तरह से किया: 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ // कुछ करें }); – Yep

3

आप लंबे समय के रूप के रूप में सुरक्षित हैं आप इसे एक पृष्ठभूमि सूत्र में चला रहे हैं।
विचार यह है कि सिंक्रोनस लोडिंग खराब है केवल मुख्य UI थ्रेड के लिए मान्य है। मुख्य यूआई थ्रेड पर एक लंबे समय तक चलने वाला ऑपरेशन आपके ऐप को उत्तरदायी बना देगा। पृष्ठभूमि में इसे करने का यह सही तरीका है। इसके अलावा, उपयोग करने पर विचार करें:

+dataWithContentsOfURL:options:error: 

ताकि कुछ भी गलत हो तो आप एक त्रुटि वापस प्राप्त कर सकें।