NSURLConnection sendSynchronousRequest semble se bloquer
Ce HTTP appel semble être suspendu et je ne vois pas pourquoi. L'enregistrement en ligne de la suite de l'appel n'est jamais à court.
Je suis à peu près sûr de faire quelque chose de très stupide, mais si quelqu'un peut ce qu'il est, je lui en serais reconnaissant. Aussi loin que je peux voir mon code est équivalent à la documentation.
Il ne semble pas à la matière ce que l'URL que j'utilise, et la requête HTTP n'est jamais enregistrés par le serveur (si pointé à une).
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]];
NSURLResponse *res = nil;
NSError *err = nil;
NSLog(@"About to send req %@",req.URL);
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&err];
NSLog(@"this never runs");
Des idées?
Mise à jour
Merci à tous ceux qui sont publiés à ce jour. Encore à voir le problème. Un peu plus de détails:
- Le code est en cours de test sur l'appareil
- Autres HTTP appels fonctionnent bien, donc si c'est un problème de réseau, c'est un non-trivial d'un
- Le code planait bien au-delà de la normale délai d'attente. Je sais qu'il se bloque pendant plus de 20 minutes. Je l'ai tué à ce moment, mais je suppose qu'il continuerait à se bloquer.
- Je ne suis pas actuellement à l'aide d'un délégué et ne comptez pas, voir ci-dessous.
- Dans d'autres endroits dans l'application j'utilise
sendAynchronousRequest
mais dans ce cas j'ai besoin de passer une valeur de retour (et je ne suis pas sur le thread principal), doncsendSynchronousRequest
est la seule option que je connais. - En cas de questions, le contexte est que je me suis mise en œuvre de la
NSURLCache
protocole, plus précisément lecachedResponseForRequest
méthode, qui nécessite-je retourner unNSCachedURLResponse
- Avez-vous le voir dans la référence? "Parce que cet appel peut prendre plusieurs minutes à l'échec (en particulier lors de l'utilisation d'un réseau cellulaire dans iOS), vous ne devriez jamais appeler cette fonction à partir du thread principal d'une application graphique."
- Avez-vous de mettre en œuvre le délégué des méthodes de
NSURLConnection
? Comme certains d'entre eux sont assez important. CommedidFailWithError:
oudidRecieveData:
. - Il est vrai, comme dit dans les commentaires et réponses, qui
sendSynchronousRequest:
bloque le thread principal. Mais cela n'explique pas pourquoi cette méthode doit s'accrocher éternellement, tel que revendiqué dans la question. Il doit y avoir un autre problème. (Et votre code fonctionne dans mon simulateur en moins d'une seconde.) - Pourquoi cette question est d'obtenir downvotes? --
- Je voudrais savoir combien de temps l'OP attendu avant d'abandonner. C'est un facteur important.
sendSynchronousRequest:
ne pas utiliser délégué méthodes.- Merci pour la clarification. Je ne savais pas, j'avais supposé qu'il a fait depuis qu'il utilise
NSURLConnection
. - J'ai couru le code. Il a bien fonctionné.
- J'ai attendu différents moments. D'attente est de plus de 5 minutes. Je suis sur une connexion wifi, et je vois encore le coup avec mon local serveur de dev. Actuellement à la recherche à mon délégué déclaration comme cela semble être le candidat le plus probable. Merci tout le monde.
- Si vous avez attribué un délégué à la
NSURLConnection
objet? Un autre détail important manquant à partir de la question. - Ce délégué déclaration?
sendSynchronousRequest:
ne pas utiliser délégué méthodes. Le problème se produit sur le périphérique ou simulateur? - yep, j'ai réalisé que, après commentant et en regardant fixement blanc XCode pour un moment. Le problème se produit sur le périphérique.
- avez-vous comprendre cela? Je suis aussi en train d'essayer d'envoyer un NSURLConnection dans le cachedResponseForRequest méthode. Je suis également à traîner. Je vois que vous êtes à l'aide de la webview proxy, mais qui ne s'applique pas à ma situation.
- non, je n'ai pas le résoudre. Étant donné que le même code fonctionne très bien lorsqu'il est exécuté dans d'autres contextes, je soupçonne quelque chose à propos de
cachedResponseForRequest
est à l'origine une erreur que mon code n'a pas pris de
Vous devez vous connecter pour publier un commentaire.
Exécuter la demande dans un contexte de file d'attente afin de ne pas bloquer le thread principal où l'INTERFACE utilisateur mise à jour:
sendAsynchronousRequest
?dispatch_async
ne m'aide pas à le faire.Ajouter le délégué
<NSURLConnectionDataDelegate>
Cette méthode plus mieux de télécharger des données.. Il l'habitude de l'utiliser thread principal ainsi, l'application coutume de s'accrocher.. j'espère qu'il sera plus utile pour vous
Ce code fonctionne dans d'autres contextes, il est donc clair que ça se passe, parce que l'appel est effectué à partir de la
cachedResponseForRequest
méthode d'unNSURLCache
. L'exécutant d'ailleurs fonctionne très bien.Depuis que ceci a été prévu pour permettre à un proxy entre les appels AJAX dans une intégré
UIWebView
et le serveur (dans le but de ne pas avoir à réécrire l'API demande de signature de code en JS), j'ai travaillé autour d'elle à l'aide de Marcus Westin WebViewProxy classe qui fonctionne un régal.Lors de votre demande aboutit à la réponse alors votre NSLog exécutera parce que sendSynchronousRequest méthode fonctionne sur le thread principal.
Son un
synchronous
méthode - c'est à dire qu'il fonctionne sur l' thread principal. Par conséquent, votre application se bloque et il va attendre que les données sont téléchargées.Empêcher: utiliser le
sendAsynchronousRequest
méthode. Il va exécuter ce processus sur un thread d'arrière-plan et ne perturbent pas votre application, ou tout simplement - ne le fera pas accrocher.Voici comment utiliser
sendAsynchronousRequest
:Compte tenu de toutes les circonstances, je pense que le problème existe à cause de votre délégué de la déclaration. Déclarer
<NSURLConnectionDataDelegate>
et de la déclarer unNSMutableData
:myData
objet et unNSURLConnection
:urlConnection
en tant que propriétés. Maintenant, utilisez ce :sendSynchronousRequest
n'est pas de retour avant d'essayer une autre approche. Comme je l'ai ajouté dans une mise à jour ci-dessus, j'ai besoin de passer un spécifique de la valeur de retour donc à l'aide d'un délégué, un appel asynchrone, ou de l'envoi de la file d'attente fera que difficile.