NSOperationqueu的NSURLConnection问题

时间:2010-10-04 20:01:07

标签: iphone nsurlconnection nsoperationqueue

您好我正在尝试创建一个NSOperaion队列来下载一堆PDF文件。但它不起作用。委托方法不会被调用NSURLConnection,因为我把它们放在NSOperation队列中......任何替代方案或解决方案???

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

3 个答案:

答案 0 :(得分:3)

看看这里,这是一个对我有帮助的教程,所以我给它添加了书签

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

答案 1 :(得分:1)

我无法真正看到代码存在问题,但它可能是一个线程问题。 NSOperationQueue通过Grand Central Dispatch创建一个线程来运行该操作。如果NSURLConnection然后也试图创建一个线程,它可能会导致一个问题 - 我不确定一个线程可以是一个子线程的子节点。

您可以执行sendSynchronousRequest:以便它保留在您在NSOperationQueue中创建的线程中,看看它是否更好。

答案 2 :(得分:0)

NSURLConnection需要运行NSRunLoop才能运行。如果在NSRunLoop未运行的线程上调用NSURLConnection方法,则NSURLConnection将永远不会运行。 NSOperationQueue创建的工作线程没有运行NSRunLoops。当NSURLConnection收到服务器的响应时,你也不能保证线程仍然存在。

可以从后台线程调用NSURLConnection方法,但它必须是一个可以保证其生命周期的线程,并且需要运行NSRunLoop。