2011-02-23 3 views
2

J'ai une application qui fait un usage modéré de NSURLConnection. Ces appels asynchrones finissent par se terminer et se relâchent correctement (ça ressemble à ça), mais parfois ça prend du temps pour qu'ils finissent.Comment dire à l'iPhone NSURLConnection d'abandonner

Ainsi, il y a des moments où je quitte l'application, (notez, pas simplement en lui envoyant l'arrière-plan), que certaines de ces connexions sont toujours actives. Si je redémarre immédiatement l'application, l'application se bloque au démarrage. (didFinishLaunchingWithOptions ne semble jamais appelé).

Bien que je ne sois pas certain que ces connexions sont le problème, il serait probablement bon de terminer ou d'annuler tout reste. Des suggestions sur la façon de faire cela?

Points bonus sur la façon de déboguer le redémarrage également. (J'enregistre déjà des relevés NSLog dans un fichier téléchargeable)

+0

Il semble que le problème de démarrage se produit uniquement dans le débogueur. – Jahmic

Répondre

7

Vous pouvez annuler n'importe quelle connexion NSURLC en lui envoyant une commande d'annulation.

[connection cancel];

De Apple docs

Abandonner une charge asynchrone d'une requête . Une fois cette méthode appelée, le délégué du destinataire ne recevra plus de messages pour cette connexion NSURLConnection .

Votre problème de démarrage pourrait être lié mais difficile à dire sans savoir quel type de données vous téléchargez et comment vous les utilisez.

+0

C'est essentiellement ce que j'ai découvert aussi. Cependant, comme dans les cas comme le mien, je devrais garder une liste dynamique de connexions actives, donc quand le moment viendra, vous savez lesquelles annuler. – Jahmic

+0

@jahmic Même problème ici, je dois aussi gérer le chargement de l'image sur la cellule tableview via NTLM et confus comment fermer la connexion particulière. – dip

+0

@dip C'était il y a longtemps. Donc, les détails sont flous, mais il me semble me souvenir de garder un tableau de toutes les connexions et de les parcourir périodiquement pour vérifier chacune des connexions. – Jahmic

0

Assurez-vous que vous appelez la version sur la connexion. Peut-être n'appelle-t-il pas shutdown ou close sur le socket tant que la dernière référence n'a pas été supprimée. Je fais quelque chose comme ça sans problèmes avec les références.

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[connection release]; 
[request release]; 
+0

oui, lors des notifications de délégué de fini ou d'échec, la libération est appelée. Mais ce que je veux dire, plutôt que d'attendre que les appels asynchrones se terminent, leur dire d'abandonner maintenant. possible? – Jahmic

0

Pour annuler dernière demande: [NSURLConnection cancelPreviousPerformRequestsWithTarget: self];

Pour annuler une demande spécifique: [request cancel]; Remarque: Ici la requête est l'instance de NSURLConnection