2010-10-04 20 views
1

Bonjour J'essaye de créer une file d'attente NSOperaion pour télécharger un tas de fichiers PDF. Mais ça ne marche pas. Les méthodes de délégué ne sont pas appelées pour NSURLConnection puisque je les mets dans la file d'attente de NSOperation .... toutes les alternatives ou solution?NSURLConnection Problème avec NSOperationqueu

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

Avez-vous mis une sortie de point d'arrêt ou de débogage dans votre méthode loadDataWithOperation: pour vérifier qu'elle n'est pas appelée? – Greg

+0

Ouais c'est ce qu'on appelle ... le seul problème est quand je l'ajoute dans nsoperationqueue ça ne marche pas – vivianaranha

+0

Est-ce que le téléchargement est créé correctement? (Vous n'obtiendrez pas un zéro retourné depuis l'init.) Vous ne devriez pas avoir à le faire, mais est-ce que l'appel de '[theDownload start]' fait une différence? –

Répondre

1

Je ne vois pas vraiment de problème avec le code mais cela peut être un problème de thread. NSOperationQueue crée un thread via Grand Central Dispatch pour exécuter l'opération. Si NSURLConnection essaye ensuite de créer un thread, cela peut causer un problème - je ne suis pas sûr qu'un thread puisse être un enfant d'un thread fils.

Vous pouvez faire un sendSynchronousRequest: afin qu'il reste dans le thread que vous avez créé dans NSOperationQueue et voir si cela fonctionne mieux.

0

NSURLConnection a besoin d'un NSRunLoop en cours d'exécution pour fonctionner. Si vous appelez des méthodes NSURLConnection sur un thread dont NSRunLoop n'est pas en cours d'exécution, le NSURLConnection ne s'exécutera jamais. Les threads de travail créés par NSOperationQueue n'ont pas leur NSRunLoops en cours d'exécution. Vous ne pourriez pas non plus garantir que le thread existerait toujours lorsque NSURLConnection recevrait une réponse du serveur.

Il est bon d'appeler les méthodes NSURLConnection à partir d'un thread d'arrière-plan, mais il doit s'agir d'un thread dont vous pouvez garantir la durée de vie et dont le NSRunLoop doit être exécuté.