0

iOS では、(メイン スレッドから) 同期ネットワーク リクエストを作成し、進行状況のコールバックを (別の非メイン スレッドで) 取得できますか?

今すぐ終了する必要のない、時間のかかるすべてのジョブを実行するシリアル (一度に 1 つの操作) のバックグラウンド キューがあります。ただし、ダウンロード ジョブの進行状況を表示したい。NSURLConnectionインスタンス化してデリゲートを構成し、同期接続を開始してから、進行状況のコールバックを取得できるようには見えません。

そのバックグラウンド キューで同期リクエストを作成する方法はありますか (その背後にあるジョブは完了するまで開始されないという点で同期)、それでもsetProgress:プログレスバーを更新するために送信できるコールバックを取得できますか? (リクエストが完了するまでシリアル キューのスレッドがブロックされるため、コールバックは別のキュー スレッド上にある必要があります。)

NSURLConnection に関する Apple のドキュメントによると、同期リクエストは実際には舞台裏で非同期リクエストの上に構築されています。それを再実装する必要がありますか?リクエストが終了/失敗するまでスレッドをブロックする方法が必要です。これまでのところ、私が持っている最良のリードはNSOperationQueuewaitUntilFinishedメソッドですが、非同期を開始して同期メソッドを継続的にポーリングしたくありません。

NSURLConnection ディスカッション

同期ロードは、クラスによって使用可能になった非同期ロード コードの上に構築されます。非同期読み込みシステムが、この読み込み要求専用に生成されたスレッドで URL 読み込みを実行している間、呼び出しスレッドはブロックされます。同期ロードを実行するために、呼び出し元のスレッドで特別なスレッド化や実行ループの構成は必要ありません。

4

1 に答える 1

7

非同期リクエストの上に同期リクエストを再実装することは、それほど難しくありません。リクエストが終了 (または失敗) するまで、スレッドの実行ループを手動でスピンするだけです。大まかな例を次に示します。

NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:queryURL];
// Start the download and wait until it finishes
self.downloadFinished = NO;
self.downloader = [NSURLConnection connectionWithRequest:downloadRequest delegate:self];

while (!self.isDownloadFinished)
 {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
 }

関連する NSURLConnectionDelegate メソッドは次のとおりです。

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
 {
    self.downloadFinished = YES;
 }

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
 {
    NSLog(@"An error occurred: %@", error);
    self.receivedData = nil;
    self.downloadFinished = YES;
 }
于 2012-07-13T14:03:49.870 に答える