NSURLConnectionを別のスレッドで実行しています(非同期で、メインスレッドで動作していることに気づいています)。親スレッドをデリゲートとして渡します。誰もこれを行う方法を知っていますか?別スレッドの非同期NSURLConnectionがデリゲートメソッドの呼び出しに失敗する
コード:私は私のiPhoneアプリで何かをダウンロードしていますので、私は別のスレッドで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];
}
EDIT *
理由があるとするとき、ダウンロードがキャンセルユーザーは画面をロックします(ユーザーが単にホームボタンを押して、アプリがバックグラウンドに入っても問題ありません)。私はこれがメインスレッド上で非同期に接続を実行し、別のスレッドではないことによると理解しています。
NSURLConnectionを開始するとき、私はまた、(NOT別のスレッドで)このコードを試してみました:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
[connection release];
をしかし、それは、私は、画面のロックを解除されているダウンロードに関するこれと同じ問題を抱えています。
* UPDATE
(ジェームズ・ウェブスターの答えは、スレッドの出射についても正確であることに注意してください)アップルのドキュメントを説明し、以下のトーマスの答えに追加するには: 「中断状態 - アプリがですバックグラウンドは実行していませんが、コードを実行していません。システムは自動的にこの状態にアプリを移動し、その前に通知しません。
ユーザーが画面をロックすると、アプリケーションはバックグラウンド状態になり、すぐにサスペンド状態になるので、すべての実行が停止され、ダウンロードが強制終了され、これが起こりそうであるという警告は表示されません。ユーザーが画面をロックしたがまだ見つからないという通知が表示されることがあります。
したがって、アプリがバックグラウンドに入ったときにすべてのダウンロードを一時停止(特定の情報を保存してキャンセルしてNSURLConnectionをキャンセル)し、再びアクティブになったときにHTTP Rangeヘッダーで再開します。 これは大丈夫ですが、ユーザーエクスペリエンスに悪影響を与えるバックグラウンドでダウンロードが行われていないため、理想的ではない回避策です。
NSURLConnectionリクエストで使用しているメソッド自体は非同期なので、新しいスレッドをデタッシュしなくてもマルチスレッド化されます。 – Ravin
私の問題をよりよく説明するために編集された質問。 – Zigglzworth