NSURLC проблема соединения с NSOperationqueu - PullRequest
1 голос
/ 05 октября 2010

Привет. Я пытаюсь создать очередь 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 ]

3 голосов
/ 05 октября 2010

посмотрите здесь, это руководство было полезно для меня, поэтому я добавил его в закладки

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

1 голос
/ 05 октября 2010

Я не вижу проблемы с кодом, но это может быть проблема с многопоточностью. NSOperationQueue создает поток через Grand Central Dispatch для запуска операции. Если NSURLConnection также попытается создать поток, это может вызвать проблему - я не уверен, что поток может быть дочерним по отношению к дочернему потоку.

Вы можете сделать sendSynchronousRequest: он останется в потоке, который вы создали в NSOperationQueue, и посмотрите, работает ли он лучше.

0 голосов
/ 20 июня 2012

Для работы NSURLConnection необходим работающий NSRunLoop. Если вы вызываете методы NSURLConnection в потоке, чей NSRunLoop не запущен, NSURLConnection никогда не запустится. Рабочие потоки, которые создает NSOperationQueue, не имеют своих запущенных NSRunLoops. Вы также не можете гарантировать, что поток все еще будет существовать, когда NSURLConnection получит ответ от сервера.

Можно вызывать методы NSURLConnection из фонового потока, но это должен быть поток, время жизни которого вы можете гарантировать, и для него должен быть запущен NSRunLoop.

...