2012-09-12 10 views
5

केवल आईओएस 5 में, मैं जिस एप्लिकेशन पर काम कर रहा हूं, वह अनुरोध छोड़ देता है जब मैं बड़ी संख्या में अनुरोधों को असीमित रूप से भेजता हूं। बड़े अर्थ अभी भी काफी छोटे हैं - 30 के साथ परीक्षणआईओएस 5 में एक साथ NSRLConnection अनुरोधों की संख्या तक सीमित?

प्रत्येक अनुरोध अपने स्वयं के NSRLConnection का उपयोग करता है और अपेक्षाकृत तेज़ी से वापस आने की उम्मीद है (यानि 300 एमएस -2 एस)। हम लंबे समय तक एक कनेक्शन भी खोलते रहते हैं।

ऐसा लगता है जैसे प्रत्येक 5 वां कनेक्शन डिवाइस छोड़ने में विफल रहता है। यह निश्चित रूप से सर्वर तक कभी नहीं पहुंचता है, और चार्ल्स का उपयोग करके नेटवर्क डिबगिंग में अनुरोधों को भी नहीं दिखाया जाता है।

मुझे आश्चर्य है कि अगर कोई एक साथ खुली NSURLConnection ऑब्जेक्ट्स और सक्रिय अनुरोधों की संख्या की सीमा के बारे में जानता है?

यह ध्यान देने योग्य है कि हमें आईओएस 4 में यह समस्या नहीं दिखाई दे रही है। ऐसा लगता है कि अगर हम अपने दीर्घकालिक कनेक्शन को मार देते हैं, तो हम हर 5 वें अनुरोध को और नहीं छोड़ते हैं।

+2

मैं एक NSOperationsQueue में NSOperations में मेरा डाल करने के लिए इसे जोड़ने के लिए, और अक्सर निम्नलिखित कॉल उपयोग कर सकते हैं जारी कई सौ वेब एक समय में हासिल करेगा , और कभी कनेक्शन विफलताओं का मामला नहीं मिला। मुझे एहसास है कि यह संभवतः आप जो कर रहे हैं उससे थोड़ा अलग है। आप शायद एक टेस्ट ऐप विकसित कर सकते हैं जो सिर्फ एक ही फाइल को ड्रॉप बॉक्स खाते से लाता है, और जब चीजें खराब होती हैं, तो देखते हैं कि सिस्टम कनेक्शन को छोड़ने से पहले नंबर बहुत बड़ा होने की उम्मीद है। –

उत्तर

4

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

डब्ल्यूडब्ल्यूडीसी वीडियो (2012) में इस डिजाइन पैटर्न के लिए एक अच्छा परिचय है जिसे "आईओएस पर समवर्ती उपयोगकर्ता इंटरफेस बिल्डिंग" कहा जाता है।

iOS 5 में आप एक NSURLConnection शुरू करने और एक NSOperationQueue

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

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