Asynchrone Anforderung an den Server vom Hintergrundthread
Ich habe das Problem, als ich versuchte, vom Hintergrundthread aus asynchrone Anforderungen an den Server zu senden. Ich habe nie Ergebnisse dieser Anfragen erhalten. Einfaches Beispiel, das das Problem zeigt:
@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
Dann rufe ich dies vom Hauptthread aus auf
asyncImgRequest = [[AsyncImgRequest alloc] init];
asyncImgRequest.delegate = self;
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
Methode downloadImage ist unten aufgeführt:
-(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];
}
Das Problem ist, dass die Methode imageDownloadDidFinish niemals aufgerufen wird. Außerdem keine der Methoden
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response
werden genannt. Allerdings wenn ich ersetze
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
durch
[self performSelector:@selector(downloadImage) withObject:nil];
alles funktioniert einwandfrei. Ich gehe davon aus, dass der Hintergrund-Thread stirbt, bevor die asynchrone Anforderung beendet ist und dies das Problem verursacht, aber ich bin nicht sicher. Habe ich recht mit diesen Annahmen? Gibt es eine Möglichkeit, dieses Problem zu vermeiden?
Ich weiß, dass ich die Synchronisierungsanforderung verwenden kann, um dieses Problem zu vermeiden, aber es ist nur ein einfaches Beispiel, die tatsächliche Situation ist komplexer.
Danke im Voraus.