6

मैं एक अलग थ्रेड पर एक NSURLConnection चला रहा हूं (मुझे पता है कि यह असीमित है और मुख्य धागे पर चलते समय काम करता है), लेकिन यह प्रतिनिधि कॉल नहीं कर रहा है जब भी मैं प्रतिनिधि के रूप में पैरेंट थ्रेड पास करें। क्या किसी को भी यह करना आता है?पृथक धागे पर असिंक्रोनस NSURLConnection प्रतिनिधि विधियों को कॉल करने में विफल रहता है

कोड:

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

//initiates the download connection - setup 
NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
[myURL release]; 


//initiates the download connection on a seperate thread 
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self]; 

} 


-(void)startDownloading:(id)parentThread { 

NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

[NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread]; 
//The delegate methods are setup in the rest of the class but they are never getting called... 

[pool drain]; 
} 

संपादित *

कारण मैं एक अलग थ्रेड पर NSURLConnection चलाने की आवश्यकता है क्योंकि मैं अपने iPhone एप्लिकेशन में कुछ डाउनलोड करने की कर रहा हूँ और डाउनलोड को रद्द करता है जब उपयोगकर्ता स्क्रीन लॉक करता है (यह ठीक है अगर उपयोगकर्ता बस होम बटन दबाता है और ऐप पृष्ठभूमि में जाता है)। मैं समझता हूं कि यह मुख्य थ्रेड पर कनेक्शन को असीमित रूप से चलाने के कारण है और अलग नहीं है।

मैं भी इस कोड (एक अलग थ्रेड में नहीं) की कोशिश की है जब NSURLConnection की शुरुआत:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO]; 
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [connection start]; 
    [connection release]; 

लेकिन यह मैं डाउनलोड स्क्रीन लॉक पर रद्द किया जा रहा के बारे में इस के साथ एक ही समस्या है।

* अद्यतन

नीचे थॉमस के जवाब देने के लिए जोड़ने के लिए (कृपया ध्यान दें कि जेम्स वेबस्टर जवाब भी एक धागे के बाहर निकल रहा है के बारे में सही है) एप्पल डॉक्स व्याख्या करते हैं: "निलंबित राज्य - ऐप्लिकेशन में है पृष्ठभूमि लेकिन कोड निष्पादित नहीं कर रहा है। सिस्टम ऐप्स को स्वचालित रूप से इस स्थिति में ले जाता है और ऐसा करने से पहले उन्हें सूचित नहीं करता है। निलंबित होने पर, एक ऐप स्मृति में रहता है लेकिन किसी भी कोड को निष्पादित नहीं करता है। "

चूंकि स्क्रीन को उपयोगकर्ता द्वारा लॉक किया जाता है, तब से ऐप पृष्ठभूमि स्थिति में डाल दिया जाता है और तुरंत निलंबित राज्य में डाल दिया जाता है, सभी निष्पादन किसी भी डाउनलोड को मारना बंद कर दिया जाता है और यह चेतावनी नहीं दी जाती है कि यह होने वाला है .. एक अधिसूचना हो सकती है जो मुझे बताती है कि उपयोगकर्ता ने स्क्रीन लॉक कर दी है लेकिन मुझे अभी तक कोई नहीं मिला है।

इसलिए ऐप पृष्ठभूमि में जाता है और जब यह फिर से सक्रिय हो जाता है तो इसे HTTP रेंज हेडर के साथ फिर से शुरू करने के लिए सभी डाउनलोड रोकें (NSRLConnection को रद्द करें)। यह एक कामकाज है जो ठीक है लेकिन आदर्श नहीं है क्योंकि डाउनलोड पृष्ठभूमि में नहीं हो रहा है जो उपयोगकर्ता अनुभव को नकारात्मक रूप से प्रभावित करता है ... बमर।

+0

NSURLConnection अनुरोध के लिए आप जिस विधियों का उपयोग कर रहे हैं, वे स्वयं ही असीमित हैं, भले ही आप नए धागे को अलग नहीं करते हैं, यह बहुप्रचारित ऑपरेशन होगा। – Ravin

+0

मेरे मुद्दे को बेहतर तरीके से समझाने के लिए संपादित प्रश्न। – Zigglzworth

उत्तर

1

, अपने -startDownloading विधि के अंत तुरंत पहुंचा है, और धागा निकलता है।

आपको वास्तव में मुख्य रनलोप (या जीसीडी का उपयोग) पर अपना कनेक्शन निर्धारित करना चाहिए।

डिवाइस लॉक एक और मुद्दा है। जब डिवाइस लॉक हो जाता है, तो बैटरी एप्लिकेशन को बचाने के लिए आपका एप्लिकेशन निलंबित कर दिया जाता है। आप अपना डाउनलोड पूरा करने के लिए शायद an extra amount of time when suspending के लिए पूछ सकते हैं।

+0

धन्यवाद। मैंने आपके उत्तर को बनाने के लिए अपना प्रश्न अपडेट किया। ऐसा प्रतीत होता है कि अधिक समय मांगना केवल पृष्ठभूमि में ऐप्स के लिए है और न कि निलंबित किए गए हैं। – Zigglzworth

0

मुझे लगता है कि आपकी समस्या हो सकता है कि NSURLConnection जैसे ही आप startDownloading: संदेश से बाहर निकलने के रूप में पुनः आवंटित की जाती किया गया है (या अधिक सही है जब आपके autorelease पूल बहा दिया जाता है)

हालांकि मुझे लगता है कि अपने कार्यप्रणाली वैसे भी एक सा गंवार हो सकता है । NSURLConnection जिस तरह से आप इसका उपयोग कर रहे हैं वह असीमित है और वैसे भी थ्रेडेड दिखाई देगा।

इस प्रयास करें और देखें अगर यह काम करता है आप इसे करने की उम्मीद के रूप में (यानी अपने अनुप्रयोग रुकता नहीं है, जबकि अपने कनेक्शन व्यस्त है) के बाद से अपने NSURLConnection अतुल्यकालिक है

-(void)startConnectionWithUrlPath:(NSString*)URLpath { 

    //initiates the download connection - setup 
    NSURL *myURL = [[NSURL alloc] initWithString:URLpath]; 

    myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    [myURL release]; 

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self]; 
} 
+0

मेरे मुद्दे को बेहतर तरीके से समझाने के लिए संपादित प्रश्न। – Zigglzworth

+0

ठीक है, आपका संपादन समझ में आता है। तब मेरे जवाब के पहले बिट पर ध्यान दें। ऐसा लगता है कि आपका NSURLConnection लगभग तुरंत हटा दिया गया है। –

+0

इस उत्तर को संदर्भ के मेरे अपडेट में सही होने के संदर्भ में संदर्भित किया गया है। – Zigglzworth

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