मुझे समस्या मिली है जब मैंने पृष्ठभूमि थ्रेड से सर्वर के लिए एसिंक्रोनस अनुरोध करने का प्रयास किया था। मुझे उन अनुरोधों का नतीजा कभी नहीं मिला है। सरल उदाहरण है जो समस्या से पता चलता: फिरपृष्ठभूमि थ्रेड से सर्वर के लिए असीमित अनुरोध
@protocol AsyncImgRequestDelegate
-(void) imageDownloadDidFinish:(UIImage*) img;
@end
@interface AsyncImgRequest : NSObject
{
NSMutableData* receivedData;
id<AsyncImgRequestDelegate> delegate;
}
@property (nonatomic,retain) id<AsyncImgRequestDelegate> delegate;
-(void) downloadImage:(NSString*) url ;
@end
@implementation AsyncImgRequest
-(void) downloadImage:(NSString*) url
{
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
receivedData=[[NSMutableData data] retain];
} else {
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[delegate imageDownloadDidFinish:[UIImage imageWithData:receivedData]];
[connection release];
[receivedData release];
}
@end
मैं मुख्य थ्रेड से इस फोन
asyncImgRequest = [[AsyncImgRequest alloc] init];
asyncImgRequest.delegate = self;
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
विधि downloadImage नीचे सूचीबद्ध है:
-(void) downloadImage
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[asyncImgRequest downloadImage:@"http://photography.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/Photography/Images/POD/l/leopard-namibia-sw.jpg"];
[pool release];
}
समस्या यह है कि विधि imageDownloadDidFinish कभी नहीं कहा जाता है । इसके अलावा विधियों में से कोई भी
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response
कहा जाता है। लेकिन अगर मैं
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
की जगह द्वारा
[self performSelector:@selector(downloadImage) withObject:nil];
सब कुछ सही काम कर रहा है। मुझे लगता है कि एसिंक अनुरोध समाप्त होने से पहले पृष्ठभूमि धागा मर जाता है और यह समस्या का कारण बनता है लेकिन मुझे यकीन नहीं है। क्या मैं इस धारणा के साथ सही हूँ? क्या इस समस्या से बचने का कोई तरीका है?
मुझे पता है कि मैं इस समस्या से बचने के लिए सिंक अनुरोध का उपयोग कर सकता हूं लेकिन यह एक साधारण उदाहरण है, वास्तविक स्थिति अधिक जटिल है।
अग्रिम धन्यवाद।
कैसे एक NSInvocationOperation भीतर एक अतुल्यकालिक NSURLConnection प्रदर्शन करने पर कई घंटे (8) के लिए शोध करने के बाद, समाधान में से कोई भी थे CFRunLoopRun() और CFRunLoopStop() के रूप में सुरुचिपूर्ण के रूप में। केवीओ प्रोटोकॉल का उपयोग करते हुए "isExecuting" इंस्टेंस चर के साथ गड़बड़ करने से यह बहुत बेहतर है। ध्यान देने योग्य एक बात यह है कि मैंने @ सेलेक्टर (प्रदर्शन चयनकर्ता ओनमेन थ्रेड: ऑब्जेक्ट: प्रतीक्षा करें नहीं किया: मोड :) पास हो रहा है [एनएसएआरएआरएआरआईआरआईथऑब्जेक्ट: एनएसडीफॉल्टरुन लूपमोड] मोड के रूप में। यूआई इंटरैक्शन चिकनी रखने के लिए UIKit आवश्यकताओं को पूरा करने के लिए मुख्य थ्रेड, NSDefaultRunLoopMode। आपका बहुत बहुत धन्यवाद! –
इच्छा है कि मैं और अधिक वोट दे सकता हूं। यह बेहद सहायक था। –
एआरसी के साथ संकलित परियोजनाओं के लिए, 'NSAutoReleasePool' उपलब्ध नहीं है, इसलिए कोड' @autoreleasepool {[self downloadImage: urlString] जैसा दिखाई देगा; CFRunLoopRun(); } ' – alokoko