J'ai un problème lorsque j'ai essayé de faire des requêtes asynchrones au serveur de thread d'arrière-plan. Je n'ai jamais obtenu les résultats de ces demandes. Exemple Simple qui illustre le problème:
@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
Ensuite, j'appelle cela de thread principal
asyncImgRequest = [[AsyncImgRequest alloc] init];
asyncImgRequest.delegate = self;
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
méthode downloadImage est indiquée ci-dessous:
-(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];
}
Le problème est que la méthode imageDownloadDidFinish n'est jamais appelée. En outre, aucune des méthodes
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response
sont appelés. Cependant si je remplace
[self performSelectorInBackground:@selector(downloadImage) withObject:nil];
par
[self performSelector:@selector(downloadImage) withObject:nil];
tout est travail correct. Je suppose que le thread d'arrière-plan meurt avant de demande asynchrone est fini de l'emploi, ce qui provoque le problème, mais je ne suis pas sûr. Suis-je droit à cette hypothèses? Est-il un moyen pour éviter ce problème?
Je sais que je peux utiliser requête de synchronisation pour éviter ce problème, mais ce n'est qu'un simple exemple, la situation réelle est plus complexe.
Merci à l'avance.