2

J'ai l'implémentation ci-dessous de NSURLSession.délégué NSURLSession didCompleteWithError pas appelé

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
self.session = [NSURLSession sessionWithConfiguration:configuration 
                   delegate:self 
                   delegateQueue: nil]; 

NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request]; 
[task resume];   
while(!finished) { 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]]; 
} 

et je l'ai mis en œuvre les methds délégué ci-dessous:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didCompleteWithError:(NSError *)error 
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
    completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, 
         NSURLCredential *credential))completionHandler 

la variable « fini » pour en boucle au-dessus est à 1 lorsque délégué didCompleteWithError est reçue quand indique qu'il ya une question comme réseau vers le bas, etc ...

Lorsque le réseau est en panne, je n'obtiens pas didCompleteWithErrorcallback, par conséquent la boucle while ne se ferme pas même si 10sec timeout a été spécifié et mon application se bloque en donnant Avertissement de la mémoire.

Je reçois correctement le rappel de didReceiveData, didReceiveResponse dans tous les scenarious. Je n'ai pas vérifié le rappel de didReceiveChallenge car il nécessite l'installation HTTP ici.

donc, j'ai la suite des questions à poser, si vous pouvez me aider:

1) Pourquoi est-didCompleteWithError rappel pas reçu lorsque le réseau est en panne?

2) En l'absence de problèmes de réseau, didCompleteWithError est-il reçu en cas de succès de la tâche? Si non, quel rappel indiquerait l'achèvement de la tâche, par exemple connectionDidFinishLoading lors de l'utilisation de NSURLConnection?

J'ai utilisé la politique de cache dans le paramètre request lors du démarrage de la tâche. Est-ce à cause de cela que didcompletewitherror n'est pas appelé n à la place le délégué de mise en cache doit être implémenté?

Les gars, S'il vous plaît aider. Je suis coincé.

Thankyou

+2

Ne touchez pas la boucle d'exécution à moins que le projet ne soit une interface de ligne de commande sans boucle d'exécution implicite – vadian

+0

Qu'en est-il des autres méthodes de délégation? sont-ils appelés quand il n'y a pas de panne dans netwrok? –

+0

ok. Je comprends ton point de vue . Mais pourquoi la méthode de mon délégué n'est-elle pas appelée? pourriez-vous s'il vous plaît suggérer quelque chose? – CodeTry

Répondre

0

delegateQueue: [NSOperationQueue mainQueue] au lieu de au lieu de delegateQueue: nul ne l'affaire. Je ne sais toujours pas comment. Mais oui, le problème est parti. quelqu'un pourrait-il expliquer comment cela a fonctionné?

+0

Je rencontre toujours un problème: même si j'ai défini delegateQueue: NSOperationQueue.mainQueue, mes rappels de délégué ne sont toujours pas appelés. – mixtly87

0

Votre boucle "while (! Finished)" est vraiment une mauvaise pratique. Fondamentalement, la tâche de téléchargement est une opération asynchrone mais avec votre boucle while vous bloquez le thread et forcez la tâche de téléchargement à finir dans ce thread. Cela pourrait affecter le comportement du système.

Je crois que la suppression de cette boucle résoudra votre problème.