6

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ヘッダーで再開します。 これは大丈夫ですが、ユーザーエクスペリエンスに悪影響を与えるバックグラウンドでダウンロードが行われていないため、理想的ではない回避策です。

+0

NSURLConnectionリクエストで使用しているメソッド自体は非同期なので、新しいスレッドをデタッシュしなくてもマルチスレッド化されます。 – Ravin

+0

私の問題をよりよく説明するために編集された質問。 – Zigglzworth

答えて

1

(あなたの接続がビジー状態の間、つまり、あなたのアプリが一時停止していない)、これを試してみて、あなたはそれを期待通りに動作するかどうかを確認すぐに到達し、スレッドが終了します。

実際には、メインランループ(またはGCDを使用)で接続をスケジュールする必要があります。

デバイスロックは別の問題です。デバイスがロックされていると、バッテリ寿命を節約するためにアプリケーションが中断されます。ダウンロードを完了するには、おそらくan extra amount of time when suspendingを頼むことができます。

+0

ありがとうございます。あなたの答えに基づいて質問を更新しました。より多くの時間を求めるのは、バックグラウンドにあるアプリケーションだけであり、中断されているアプリケーションには当てはまりません。 – Zigglzworth

0

私はあなたの問題はNSURLConnectionはあなたがstartDownloading:メッセージを出るとすぐに割り当てが解除された(またはより正確に、あなたの自動解放プールが排出されている場合)

は、しかし、私はあなたの方法論はとにかく少し粗野なかもしれないと思うことかもしれないと思います。 NSURLConnectionあなたがそれを使用している方法は非同期で、とにかくスレッドされているように見えます。

あなたNSURLConnectionは、あなたの-startDownloadingメソッドの最後非同期ですので

-(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]; 

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self]; 
} 
+0

私の問題をよりよく説明するために編集された質問。 – Zigglzworth

+0

あなたの編集は理にかなっています。私の答えの最初のビットに注意してください。あなたのNSURLConnectionはほぼ即座に割り当て解除されたようです。 –

+0

この回答は、私の質問の更新でも正しいと言及されています。 – Zigglzworth