1

こんにちは、たくさんの PDF ファイルをダウンロードするために NSOperaion Queue を作成しようとしています。しかし、うまくいきません。デリゲート メソッドは、NSOperation キューに入れているため、NSURLConnection に対して呼び出されません。代替手段または解決策はありますか?

- (void) loadData {
 NSOperationQueue *queue = [NSOperationQueue new];
 NSInvocationOperation *operation;
 for(int i=0;i<[self.pdfArray count];i++){
  NSString *url = [NSString stringWithFormat:@"http://www.somelink.com/%@.pdf",[self.pdfArray objectAtIndex:i]];
  operation = [[NSInvocationOperation alloc] initWithTarget:self 
               selector:@selector(loadDataWithOperation:) 
                 object:url];

  [queue addOperation:operation];
  [operation release];
 }
}

- (void) loadDataWithOperation:(NSString *) url{

 // Create the request.

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
            cachePolicy:NSURLRequestUseProtocolCachePolicy
            timeoutInterval:60.0];

    NSURLConnection  *theDownload = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
}
4

3 に答える 3

3

ここを見てください。これは私にとって役立つチュートリアルなので、ブックマークしました

http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/

于 2010-10-04T20:32:46.137 に答える
1

コードの問題は実際にはわかりませんが、スレッドの問題である可能性があります。NSOperationQueue は、Grand Central Dispatch を介してスレッドを作成し、操作を実行します。NSURLConnection もスレッドを作成しようとすると、問題が発生する可能性があります。スレッドが子スレッドの子になる可能性があるかどうかはわかりません。

sendSynchronousRequest: を実行して、NSOperationQueue で作成したスレッドにとどまり、それがうまく機能するかどうかを確認できます。

于 2010-10-04T20:31:11.527 に答える
0

NSURLConnection が機能するには、実行中の NSRunLoop が必要です。NSRunLoop が実行されていないスレッドで NSURLConnection メソッドを呼び出すと、NSURLConnection は実行されません。NSOperationQueue が作成するワーカー スレッドでは、NSRunLoops が実行されていません。また、NSURLConnection がサーバーから応答を受信したときに、スレッドがまだ存在することを保証することもできません。

バックグラウンド スレッドから NSURLConnection メソッドを呼び出すことは問題ありませんが、有効期間を保証できるスレッドである必要があり、その NSRunLoop を実行する必要があります。

于 2012-06-20T17:42:43.437 に答える