2011-10-18 14 views
29

में NSRLConnection विधियां अब और उपलब्ध नहीं हैं NSURLConnection कक्षा को देख रहा था जिसका उपयोग किसी URL पर सिंक या एसिंक कनेक्शन स्थापित करने के लिए किया जा सकता है और उसके बाद डेटा पुनर्प्राप्त कर सकता है ... इस कक्षा में बहुत सारे बदलाव किए गए हैं आईओएस 5 और मैंने देखा है कि उन्होंने प्रमाणीकरण या डाउनलोड से संबंधित कुछ औपचारिक प्रोटोकॉल पेश किए हैं, लेकिन मुझे नहीं लगता है, उदाहरण के लिए, यदि connection:didReceiveResponse: संदेश (जिसे पहले प्रतिनिधि को भेजा गया था और यह अब उपलब्ध नहीं है) अभी भी है कुछ प्रोटोकॉल में उपलब्ध है .. आप एसिंक कनेक्शन को कैसे कार्यान्वित करते हैं और पुनर्प्राप्त करते हैं, उदाहरण के लिए, जैसे ही प्रतिक्रिया प्राप्त होती है, HTTP शीर्षलेख प्राप्त होते हैं? मुझे यकीन है कि connection:didReceiveResponse: संदेश के साथ जैसी विधियों को हमेशा समकालिक रूप से लोड करते हैं? आप अपने ऐप्स में एसिंक डाउनलोड को बहिष्कृत तरीकों से परहेज करने और _http प्रतिक्रिया प्राप्त_एम आदि जैसी घटनाओं पर प्रतिक्रिया करने के लिए क्या उपयोग करते हैं? यदि आप संभव हो तो पृष्ठभूमि कार्यों में सिंक्रोनस डाउनलोड लॉन्च करते हैं?आईएसओ 5

+0

जैसा कि, आपका प्रश्न कई प्रश्नों में विभाजित होना चाहिए: आपके प्रश्न के अंदर संभावित पांच प्रश्न हैं। मेरा जवाब उन चीज़ों को संबोधित करता है जो मुझे आपके सबसे बड़े मुद्दे के रूप में समझते हैं, अर्थात् आईओएस 4.3 में उपलब्ध कनेक्शन प्रतिनिधि विधियों के स्पष्ट निष्कासन। –

उत्तर

68

NSURLConnectionDelegate औपचारिक प्रोटोकॉल बन गया है (यह पिछले संस्करणों में एक अनौपचारिक प्रोटोकॉल था)। इस प्रोटोकॉल में, निम्न (गैर पदावनत) तरीके घोषित किया जाता है:

:

  • connection:didFailWithError:
  • connectionShouldUseCredentialStorage:
  • connection:willSendRequestForAuthenticationChallenge:

इसके अलावा, वहाँ दो subprotocols कि NSURLConnectionDelegate के अनुरूप हैं

NSURLConnectionDataDelegate उन प्रतिनिधियों के लिए उपयोग किया जाता है जो डेटा को स्मृति में लोड करते हैं, और निम्न मेथो घोषित करते हैं डी एस, जिनमें से कुछ मुझे यकीन है कि आप परिचित मिल जाएगा:

  • connection:willSendRequest:redirectResponse:
  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:needNewBodyStream:
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
  • connection:willCacheResponse:
  • connectionDidFinishLoading:

NSURLConnectionDownloadDelegate प्रतिनिधियों कि डेटा एक डिस्क फ़ाइल को सीधे स्टोर के लिए प्रयोग किया जाता है, और निम्न विधियों वाणी:

  • connection:didWriteData:totalBytesWritten:expectedTotalBytes:
  • connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
  • connectionDidFinishDownloading:destinationURL:

आप देख सकते हैं , आप अभी भी अपने पिछले प्रतिनिधियों का उपयोग कर सकते हैं, संभवतः कुछ मामूली संशोधन के साथ।

अधिक जानकारी के लिए, अपने स्थानीय एक्सकोड स्थापना में iOS 4.3 to iOS 5.0 API Differences document और NSURLConnection.h देखें। जब कोई नया एसडीके संस्करण जारी किया जाता है, तो डेवलपर लाइब्रेरी पर उपलब्ध दस्तावेज से अधिक विश्वसनीय होने के लिए हेडर फ़ाइलों के अंदर दस्तावेज़ों के लिए दस्तावेज़ असामान्य नहीं है। उत्तरार्द्ध के लिए अद्यतित होने में कुछ समय लगता है।

+0

धन्यवाद ... मैंने अभी देखा है कि संदर्भ दस्तावेज़ अभी तक अपडेट नहीं किए गए हैं, इसलिए एपीआई अंतर दस्तावेज़ और हेडर फ़ाइल एक अच्छा प्रारंभिक बिंदु है .. मैंने सोचा कि मैंने कहीं देखा है (मुझे अब यह नहीं मिल रहा है ..) दस्तावेज़ों का कहना है कि आमतौर पर आपके ऐप्स को NSURLConnectionDataDelegate प्रोटोकॉल को लागू नहीं करना चाहिए ... मुझे बताएं कि क्या मैं गलत हूं: यदि आपको एक प्रकार की डाउनलोड प्रगति पट्टी को लागू करने की आवश्यकता है, तो क्या आप समझने के लिए didReceiveData का उपयोग नहीं करना चाहिए, मैंने कुछ डेटा डाउनलोड किया है या क्या मैंने गलत समझा है कि रीसीवडाटा कैसे काम करता है और इसे कब भेजा जाता है? –

+0

@Gianni हां, '- ... didReceiveData: 'यह सूचित करने के लिए प्रतिनिधि को भेजा गया है कि डेटा प्राप्त हुआ है। उन आंकड़ों को संग्रहित करने के अलावा, आप डाउनलोड प्रगति पट्टी को अपडेट करने के लिए इसका उपयोग कर सकते हैं। –

+0

एफवाईआई, 04/08/12 तक, 5.1 एसडीके दस्तावेज़ों में अभी भी NSURLConnectionDataDelegate (न तो ऑनलाइन और न ही एसडीके के भीतर) पर एक संपूर्ण संदर्भ नहीं है। –

2

मुझे बस इसी समस्या का सामना करना पड़ा। ऐसा लगता है कि एसिंक्रोनस अनुरोध भेजने से ब्लॉक और NSOperationQueue के साथ अधिक सरलता प्राप्त होती है।

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler 

इसका मतलब है कि प्रतिनिधि अब केवल प्रमाणीकरण और विफलता के मुद्दों के लिए उपयोग किया जाता है।

+0

धन्यवाद, मुझे संदर्भ दस्तावेज़ों में यह नहीं मिला, शायद इसे जल्द ही अपडेट किया जाएगा। –

+1

आम तौर पर इसे अब अपडेट किया गया है। हालांकि देखें, क्योंकि यह विधि आईओएस 4.3 पर उपलब्ध नहीं है। संक्षेप में: आपको आईओएस 4.3 और आईओएस 5.0 के साथ संगत होने के दोनों तरीकों को लागू करने की आवश्यकता होगी। –

2

नहीं पर उपलब्ध किया जाना चाहिए था! यदि आप ऐप्पल की लाइब्रेरी के माध्यम से ध्यान से देखते हैं तो वे प्रमाणीकरण और विफलता के मुद्दों के लिए उपयोग तक सीमित नहीं हैं।

NSConnection वर्ग वस्तु को +(void)sendAsynchronousRequest:queue:completionHandler: शुरू करने के बाद से, कई बातें जो पहले की तरह के रूप में कई NSConnectionDelegate विधि प्रदर्शन कर सकते हैं अब "NSConnectionDataDelegate" & NSConnectionDownloadDelegate बुलाया औपचारिक प्रोटोकॉल में इस्तेमाल किया जा सकता, NSURLConnection तरीकों को और अधिक सुविधा जोड़ने के लिए एक नया कक्ष खोलने। (आईओएस 5 से)

तो मुझे लगता है कि यह एक सुधार है, न कि उनके उपयोग को सीमित कर रहा है।

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