2009-08-10 3 views
10

J'utilise NSMutableURLRequest pour me connecter à un site Web afin d'obtenir une réponse JSON. Je le fais en générant la demande, puis en utilisant NSURLConnection avec un délégué de self pour gérer la connexion asynchrone. Je l'ai mis en œuvre toutes les méthodes déléguées normales:Gestion d'une requête NSURL avec le délai d'attente lors de l'utilisation du délégué

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Tout fonctionne parfaitement avec l'obtention de données en arrière, traiter toutes les erreurs qui se produisent, etc. Cependant, avec le délai d'attente sur le NSURLRequest fixé à 10 secondes, je ne semble pas pour être appelé dans ces méthodes (je m'attendais à ce que didFailWithError soit appelé). Il se trouve juste là pour toujours et je n'ai aucune notification qu'il a expiré.

Lire les documents de l'API de l'iPhone Je ne vois aucune mention de ce que devrait arriver quand le délai d'attente se produit, juste que vous pouvez définir la valeur du délai d'attente. Que devrait-il se passer? Je n'ai vu aucune autre méthode de délégué dans l'API qui pourrait aider. Je n'ai pas à vérifier manuellement les délais, n'est-ce pas? Les délais d'attente sont-ils uniquement pour les demandes synchrones?

+0

Je suis d'accord avec Corey que je devrais l'obtenir dans la méthode didDailWithError, mais elle ne sera jamais appelée. Les points d'arrêt et les journaux de cette méthode indiquent qu'elle n'est jamais appelée pour un délai d'expiration. – Parrots

+1

Pour plus de contexte, au cas où cela ferait une différence, j'utilise la méthode dont il est question dans la réponse de http://stackoverflow.com/questions/332276/managing-multiple-asynchronous-nsurlconnection-connections pour suivre les connexions I avoir exceptionnel. – Parrots

+0

Je dirais que cela pourrait avoir été un bug dans le SDK bêta de 3.0, car dès que la version finale a été publié, il a fonctionné comme prévu. – Parrots

Répondre

12

Votre délai d'attente est reçu dans cette méthode:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
+0

Comment pouvez-vous tester le délai d'expiration? Cela semble être un gestionnaire d'erreur générique. – devios1

+14

Trouvé: 'error.code == NSURLErrorTimedOut' – devios1

1

Mettez des instructions de journal dans chaque méthode et vérifiez ce qu'elles donnent. Chaque fois que cela expire, vous obtenez certainement une notification sur la console à propos du délai d'expiration. Je reçois cette notification. Vérifiez votre code et si vous avez encore des problèmes, faites le nous savoir.

4

u br recevant ce type de iofo:

à n'échouer avec

error: Error Domain=NSURLErrorDomain Code=-1001 UserInfo=0xed4870 "timed out"

+0

Remarque 'NSURLErrorTimedOut = -1001' – devios1

3

Le comportement de délai d'attente est un peu bizarre , voir this thread sur les forums des développeurs d'Apple.

+1

Ce fil est génial! Merci! Notez que thread vous donne une référence à https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html, qui répertorie toutes les erreurs dans le NSURLErrorDomain –

1

Ce que je l'ai fait était le suivant:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    if (error.code == -1001){ 
     [self showTimeoutAlert];//My method to show dialog with timeout message. 
    } else { 
     [self showInvalidURLAlert];//My method to show dialog with bad URL message. 
    } 
} 

Comme dit précédemment -1001 est pour le délai, dans d'autres tests que je suis -1003 (pour mauvaise URL ou non avaliable de connexion). Je visais à traiter le délai d'expiration de sorte que tout ce que j'ai traité comme une mauvaise URL.

Questions connexes