バックグラウンドスレッドからサーバーへの非同期リクエストを実行しようとすると、問題が発生します。私はそれらの要求の結果を得たことがありません。問題を示す簡単な例:
@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];
すべてが正しく機能しています。非同期リクエストが終了する前にバックグラウンドスレッドが停止し、これが問題の原因になると思いますが、よくわかりません。私はこの仮定で正しいですか?この問題を回避する方法はありますか?
同期要求を使用してこの問題を回避できることはわかっていますが、これは単純な例であり、実際の状況はより複雑です。
前もって感謝します。