別のスレッドでNSURLConnectionを実行していますが(非同期であり、メインスレッドで実行すると機能することを認識しています)、親スレッドをデリゲートとして渡してもデリゲート呼び出しは行われません。誰かがこれを行う方法を知っていますか?
コード:
-(void)startConnectionWithUrlPath:(NSString*)URLpath {
//initiates the download connection - setup
NSURL *myURL = [[NSURL alloc] initWithString:URLpath];
myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[myURL release];
//initiates the download connection on a seperate thread
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self];
}
-(void)startDownloading:(id)parentThread {
NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
[NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread];
//The delegate methods are setup in the rest of the class but they are never getting called...
[pool drain];
}
編集*
別のスレッドでNSURLConnectionを実行する必要がある理由は、iPhoneアプリで何かをダウンロードしていて、ユーザーが画面をロックするとダウンロードがキャンセルされるためです(ユーザーがホームボタンを押すだけでアプリがバックグラウンドに入ると、問題なく続行されます) )。これは、別のスレッドではなく、メインスレッドで非同期に接続を実行しているためだと理解しています。
NSURLConnectionを開始するときに、このコードを(別のスレッドではなく)試しました。
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
[connection release];
しかし、画面ロックでダウンロードがキャンセルされるという点で、これと同じ問題があります。
*更新
以下のトーマスの回答に追加するには(スレッドの終了に関してジェームズウェブスターの回答も正しいことに注意してください)、Appleドキュメントは次のように説明しています:「一時停止状態-アプリはバックグラウンドにありますが、コードを実行していません。システムはアプリをに移動しますこの状態は自動的に発生し、通知する前に通知されません。一時停止中、アプリはメモリに残りますが、コードは実行されません。」
ユーザーが画面をロックすると、アプリはバックグラウンド状態になり、すぐに一時停止状態になるため、すべての実行が停止され、ダウンロードが強制終了され、これが発生しようとしているという警告は表示されません...ユーザーが画面をロックしたが、まだ画面が見つからないことを通知する通知。
したがって、アプリがバックグラウンドに移行したときにすべてのダウンロードを一時停止(特定の情報を保存してNSURLConnectionをキャンセル)し、アプリが再びアクティブになったときにHTTPRangeヘッダーで再開します。これは問題のない回避策ですが、ダウンロードがバックグラウンドで行われていないため、ユーザーエクスペリエンスに悪影響を与えるため、理想的ではありません...残念です。