2009-11-10 14 views
9

मुझे भ्रमित हो रहा है सिंक्रोनस NSUrlConnection और ASynchronous NSUrlConnection के बीच क्या अंतर है? क्या सिंक्रोनस या असिंक्रोनस है? अगर हम कनेक्शन में detachNewThreadSelector का उपयोग करते हैं DidFinishLoading विधि, क्या यह असीमित NSUrlConnection है? कौन सा सबसे अच्छा तरीका है? कोई ट्यूटोरियल ...वास्तव में NSUrlConnection एसिंक्रोनस का क्या अर्थ है?

उत्तर

22

सिंक्रोनस का मतलब है कि आप अपना NSURLConnection अनुरोध ट्रिगर करते हैं और इसके लिए प्रतीक्षा करते हैं।

असिंक्रोनस का अर्थ है कि आप NSURLConnection डाउनलोड डेटा के दौरान अनुरोध को ट्रिगर कर सकते हैं और अन्य सामान कर सकते हैं।

कौन सा "सर्वश्रेष्ठ" है?

तुल्यकालिक बहुत सरल है: आप इसे सेट अप करते हैं, इसे आग लगाते हैं, और डेटा को वापस आने की प्रतीक्षा करते हैं। लेकिन आपका आवेदन वहां बैठता है और जब तक सभी डेटा डाउनलोड नहीं होता है, कुछ त्रुटि होती है, या अनुरोध का समय समाप्त होता है। यदि आप थोड़ी सी मात्रा से अधिक डेटा से निपट रहे हैं, तो आपका उपयोगकर्ता वहां इंतजार करेगा, जो एक अच्छा उपयोगकर्ता अनुभव नहीं करेगा।

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

आप NSURLConnection के साथ समकालिक और असीमित अनुरोध दोनों कर सकते हैं। ऐप्पल का documentation बाद के दृष्टिकोण के लिए आवश्यक दो दृष्टिकोणों और प्रतिनिधि विधियों की स्पष्ट व्याख्या प्रदान करता है।

+0

मैं कनेक्शन की पहचान कैसे कर सकता हूं सिंक्रोनस या असीमित? यदि आप निम्न उदाहरण देखते हैं, http://developer.apple.com/iphone/library/samplecode/SeismicXML/ क्या आप बताएंगे कि इसका क्या उपयोग किया गया है? अगर कनेक्शन WithRequest: प्रतिनिधि: Asynchronous को संदर्भित करता है, अगर भेजता है सिंक्रोनस रिवेस्ट: रिटर्निंग रिस्पॉन्स: त्रुटि: सिंक्रोनस को संदर्भित करता है, कुछ उदाहरण NSUrl कनेक्शन में दोनों का उपयोग नहीं करते ....? –

10

ऐसा लगता है कि आप सिंक्रोनस/एसिंक्रोनस कनेक्शन और थ्रेडिंग को भंग कर रहे हैं। मेरे ऐप में मैंने थ्रेडिंग के विकल्प के रूप में एसिंक्रोनस कनेक्शन का इस्तेमाल किया।

मान लें कि आप UI को फ्रीज किए बिना एक बड़ी फ़ाइल डाउनलोड करना चाहते हैं। आपके पास दो बुनियादी विकल्प हैं:

  1. असीमित कनेक्शन। आप + connectionWithRequest:delegate: (या अन्य गैर-ऑटोरेलीज विकल्पों में से एक) से शुरू करते हैं और यह फ़ाइल के बिट्स डाउनलोड करता है, जब दिलचस्प बात होती है तो अपने प्रतिनिधि को बुलाते हैं। रनलोप अभी भी जा रहा है, इसलिए आपका यूआई उत्तरदायी रहता है। बेशक आपको सावधान रहना होगा कि आपका प्रतिनिधि दायरे से बाहर नहीं निकलता है।

  2. तुल्यकालिक। आप + sendSynchronousRequest:returningResponse:error: के साथ कनेक्शन शुरू करते हैं लेकिन कोड पूरा होने तक कोड प्रतीक्षा करता है। आपको वास्तव में एक नया धागा (या उच्च स्तर के थ्रेडिंग ऑपरेशंस में से एक कोको समर्थन करता है) या यूआई अवरुद्ध करने की आवश्यकता होगी।

कौन सा विकल्प "सर्वश्रेष्ठ" या कम से कम दर्दनाक होगा आपके आवेदन की वास्तुकला और जो आप प्राप्त करने की कोशिश कर रहे हैं, उस पर निर्भर करेगा। यदि आपको किसी भी लंबे समय तक चलने वाली प्रक्रिया के लिए धागा बनाना है, तो आप दूसरे विकल्प के साथ जा सकते हैं। आम तौर पर मैं कहूंगा कि पहला विकल्प सबसे आसान है।

यह सब ठीक है documented on Apple's Developer site

3

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

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

2

फ़ाइल आकार के संबंध में अन्य उत्तरों के जवाब में: मुझे लगता है कि फ़ाइल का आकार कोई फर्क नहीं पड़ता। यदि सर्वर वास्तव में धीरे-धीरे प्रतिक्रिया देता है और आप डेटा को सिंक्रोनस लोड कर रहे हैं तो आपका यूआई अभी भी फ्रीज हो जाता है, भले ही आप थोड़ी मात्रा में डेटा लोड कर रहे हों, जैसे 3k।

तो मैं हर स्थिति में एसिंक्रोनस विकल्प के लिए जाऊंगा, क्योंकि आप कभी भी नहीं जानते कि आप फ़ाइल आकार, सर्वर प्रतिक्रिया या नेटवर्क की गति के संबंध में क्या प्राप्त करने जा रहे हैं।

संबंधित मुद्दे