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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage