2012-02-15 18 views
8

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

हमने इसे इस तथ्य पर ट्रैक किया कि NSURLConnection चंक-एन्कोडिंग में प्रतिक्रियाओं के साथ अच्छा व्यवहार नहीं करता है। या कम से कम इसलिए हम इस प्रश्न में NSURLConnection and "chunked" transfer-coding

कुछ डेवलपर जो हम कह रहे थे कि यह आईओएस 5 में बेहतर हो जाता है, हमें यह सुनिश्चित करने की ज़रूरत है कि हमारा एसडीके कम से कम आईओएस 4.3 के साथ संगत है।

मैं यह पुष्टि करना चाहता हूं कि यह NSURLConnection में वास्तव में एक समस्या है, और लोग इसके साथ कैसे व्यवहार कर रहे हैं।

अब तक जो भी विकल्प मिले हैं, वे NSURLConnection से अलग हैं और मुझे लगता है कि इस तरह के समान दोष होंगे। ASIHTTPRequest वास्तव में काम करता था क्योंकि यह NSURLConnection से थोड़ा कम था, लेकिन ज्ञान में विकल्पों की तलाश में था जो अब समर्थित नहीं है।

अन्य पुस्तकालयों की सूची को देखा हैं: Restkit, ShareKit, LRResty, AFNetworking, TTURLRequest

मुझे पता है इसी तरह के सवाल यहाँ Is RESTKit a good replacement for ASIHTTPRequest? और यहाँ ASIHTTPRequest alternative हैं हूँ लेकिन समाधान के दोनों कर रहे हैं NSURL कनेक्शन से आधारित है।

संपादित करें: मैंने देखा है कि मैंने अपनी पोस्ट की शुरुआत में गलत प्रश्न की ओर इशारा किया है, इसलिए अपडेट किया गया है। यह 2008 से एक धागे को इंगित करता है, और मैंने इसी तरह देखा है लेकिन हाल ही में कोई भी नहीं है।

+0

अभी तक, मैं यह जांचना चाहता था कि अन्य डेवलपर्स ने इसी तरह के नतीजे देखे हों। मुझे अभी एहसास हुआ कि मैंने अपने प्रश्न में गलत लिंक डाला है। मेरा मतलब था (http://stackoverflow.com/questions/8606493/nsurlconnection-and-chunked-transfer- कोडिंग)। मैंने पोस्ट को और जानकारी के साथ अद्यतन किया है। – pyr0manic

उत्तर

19

चंक किए गए स्थानान्तरण NSURLConnection द्वारा समर्थित हैं। मैं उनका उपयोग करता हूं।

  1. परिभाषित कुछ रंगमंच की सामग्री:

    NSMutableData * responseData; 
    NSURLConnection * connection; 
    
  2. एक कनेक्शन

    NSURL *url = [NSURL URLWithString:@"...."]; 
    self.responseData = [[NSMutableData alloc] initWithLength:0] ; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
    
  3. कनेक्ट के लिए अपने कॉलबैक विधि रजिस्टर की स्थापना आयन

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
        // You may have received an HTTP 200 here, or not... 
        [responseData setLength:0]; 
    } 
    
  4. स्थापित अपने कॉलबैक विधि रजिस्टर के लिए "हिस्सा प्राप्त"

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
        NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
    
        NSLog(@"This is my first chunk %@", aStr); 
    
    } 
    
  5. अपने "कनेक्शन समाप्त हो गया" रजिस्टर कॉलबैक:

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
        [connection release]; 
    } 
    
  6. और अंत में, रजिस्टर आप "कनेक्शन विफल" कॉलबैक:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Something went wrong..."); 
} 
+0

जैसा कि आप देख सकते हैं, यह उचित है और आपको किसी भी अन्य ढांचे का उपयोग करने की आवश्यकता नहीं है। मैं प्रत्येक दिन ASIHTTP का उपयोग करता हूं, लेकिन खंडित स्थानांतरण एन्कोडिंग के लिए, यह पर्याप्त है :) –

+2

http://i3.kym-cdn.com/photos/images/newsfeed/000/150/505/f30fd24c56e1bcfc926883d6a51d5a00.gif –

+0

धन्यवाद, मैं जैसे ही मुझे एसडीके में फिर से खोदने का समय मिलता है, मैं इसे एक परीक्षण दूंगा और अगर मैं काम करता हूं तो मैं इसे उत्तर के रूप में सेट करना सुनिश्चित कर दूंगा। – pyr0manic

2

कोई विकल्प नहीं है जिसके बारे में मुझे पता है।

अन्य सभी पुस्तकालय NSURLConnection के शीर्ष पर बनाए गए हैं। हालांकि आप गैर-आईओएस पुस्तकालयों में से एक का उपयोग कर सकते हैं, उदाहरण के लिए। libcurl।

ASIHTTPRequest एकमात्र लाइब्रेरी है जिसे मैं जानता हूं कि इसके बजाय CFNetworking परत के शीर्ष पर बनाया गया है। यह (संभवतः अप्रत्यक्ष रूप से) मूल डेवलपर ने इस पर काम करना बंद कर दिया था - क्योंकि यह NSURLConnection का उपयोग नहीं करता है, इसका कोड बहुत कोड है।

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

यह सब कहकर, आपके पास समस्या पर वापस जाने के लिए: मुझे यकीन नहीं है कि 3 साल पुराना धागा अनिवार्य रूप से यह साबित करने के लिए एक निश्चित संदर्भ है कि NSRLConnection की 1 वर्ष पुरानी रिलीज (यानी आईओएस 4.3) चंकित स्थानान्तरण का समर्थन नहीं करते हैं। वेब पर चंकित स्थानान्तरण का उपयोग इतना अधिक होता है कि ऐसा लगता है कि यह बहुत अधिक संभावना नहीं है, यह बड़ी और स्पष्ट समस्या होगी। यह संभव है कि उस सर्वर के लिए कुछ खास हो जो आप उपयोग कर रहे हैं जिससे समस्या उत्पन्न हो रही है।

+0

मैं सहमत हूं, और मैंने सोचा कि अगर यह अभी भी एक गंभीर मुद्दा था तो मुझे बहुत कुछ मिल जाएगा। एएसआई का उपयोग अब इसका मतलब है कि हमने इसे और अधिक नहीं खोजा, लेकिन इसे पोस्ट करने से पहले मैं आश्चर्यचकित होना शुरू कर दूंगा (इसलिए पुष्टि की तलाश में)। मैं शायद वापस जाऊंगा और जब मुझे मौका मिलता है तो मुझे एक नजर आती है क्योंकि यदि संभव हो तो NSURLConnection का उपयोग करना बेहतर है (छोटे कोड बेस और पुस्तकालयों को आयात करने की आवश्यकता नहीं है आदि) एक बार जब मैं करूँगा किसी और के लिए सोचने के लिए इसे अद्यतन करें। – pyr0manic

8

बस अगले व्यक्ति है कि यहाँ हो जाता है और अभी भी NSURLConnection के लिए नहीं मिल सकता है के लिए में झंकार के लिए खंड एन्कोडेड डेटा के साथ काम करें।

NSURLConnection खंडित एन्कोडिंग के साथ काम करेगा, लेकिन इसमें आंतरिक व्यवहार का खुलासा नहीं किया गया है कि यह कनेक्शन खोलने से पहले पहले 512 बाइट बफर करेगा और प्रतिक्रिया शीर्षलेख में सामग्री-प्रकार के माध्यम से कुछ भी "टेक्स्ट/एचटीएमएल" है, या "एप्लिकेशन/ऑक्टेट-स्ट्रीम"। यह कम से कम आईओएस 7 से संबंधित है।

हालांकि सामग्री-प्रकार "टेक्स्ट/जेसन" पर सेट होने पर यह प्रतिक्रिया को बफर नहीं करता है। इसलिए, जो भी काम करने के लिए एनकोडेड एनएसआरएलकनेक्शन प्रतिक्रियाओं को घुमाया नहीं जा सकता है (यानी कॉलबैक नहीं कहा जाता है) को प्रतिक्रिया शीर्षलेख की जांच करनी चाहिए और सर्वर पर इसे "टेक्स्ट/जेसन" में बदलना चाहिए यदि यह किसी अन्य तरीके से एप्लिकेशन व्यवहार को तोड़ता नहीं है ।

+0

मुझे दूसरे पैराग्राफ में तर्क समझ में नहीं आता है "अगर सामग्री-प्रकार" टेक्स्ट/जेसन "पर सेट किया गया है और" सर्वर पर इसे "टेक्स्ट/जेसन" में बदल दिया गया है तो यह प्रतिक्रिया को बफर नहीं करता है "विरोधाभासी प्रतीत होता है । क्या आप NSURL कनेक्शन को बफर करने के लिए नहीं चाहते हैं? यदि नहीं, तो क्यों नहीं? – Gruntcakes

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि आप क्या समझ में नहीं आते हैं, लेकिन मैं इसे फिर से लिखूंगा: यदि सामग्री-प्रकार टेक्स्ट/जेसन नहीं है तो यह बफर किया जाएगा। यह एक मूल्य निर्णय नहीं है, मैं सिर्फ व्यवहार बता रहा हूं। व्यक्तिगत रूप से, मैं नहीं चाहता कि यह buffered क्योंकि जिस सर्वर पर मेरा कोई नियंत्रण नहीं था, वह सामग्री प्रकार के रूप में टेक्स्ट/जेसन सेट नहीं करता था, जिससे प्रतिक्रिया (जो वास्तव में जेसन नहीं है, लेकिन कस्टम लाइन आधारित प्रोटोकॉल) नहीं आती है। मैं नहीं चाहता कि यह buffered क्योंकि अनुप्रयोग तर्क और आगे की कार्रवाई उन 512 बाइट्स के अंदर कुछ पर निर्भर करती है जो कभी नहीं आएगी। "लॉगिन प्रतिक्रिया" या इसी तरह सोचें। – maksa

+0

@ मक्का पाठ/जेसन एक आधिकारिक एमआईएम प्रकार नहीं है। क्या आपकी टिप्पणियां एप्लिकेशन/जेसन पर समान रूप से लागू होती हैं? – Gruntcakes

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

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