2010-12-29 4 views
1

Mon application appelle un service Web pour charger les données. Chaque fois que j'envoie la requête, la méthode connection: didReceiveData: est invoquée très rapidement, et je mets une instruction NSLog dans cette méthode, je peux voir que les données que je reçois sont identiques à celles affichées dans le champ d'en-tête Content-Length. Il ne devrait donc plus y avoir de données à recevoir. En fait, connection: didReceiveData n'est plus invoqué. Mais mon connectionDidFinishLoading est invoqué exactement 1 minute plus tard à chaque fois. Une idée de ce qui se passe?connectionDidFinishLoading n'est pas appelé immédiatement

+0

Lorsque vous appuyez sur le service avec curl ou un navigateur Web, avez-vous une indication que la fin de la demande est plus courte? – Walter

+0

Puisqu'il s'agit d'un webservice, je ne sais pas comment utiliser curl pour faire cet appel de service web, je me demande simplement si c'est possible. Cependant, si mon programme n'effectue probablement pas l'appel webservice, c'est le message d'erreur de retour du serveur, c'est rapide. Le délai n'arrive que lorsque j'obtiens les données correctement. Je me demande juste si le problème côté serveur parce que j'utilise mon programme pour appeler un autre webservice qui est public et gratuit sur le web, j'ai aussi obtenu le résultat très rapidement. – user556623

+0

Maintenant, je me demande comment NSURLConnection pour juger si les données sont terminées et ensuite appeler la méthode connectionDidFinishLoading. Quelque chose comme un '\ 0' pour indiquer les données est le transfert de finition? Ou simplement comparer la longueur du contenu dans l'en-tête HTTP et les octets sont reçus? S'il est jugé par '\ 0', le côté serveur n'envoie pas cet octet donc mon programme attend jusqu'à ce qu'il soit en interne (c'est pourquoi il retarde exactement 1 minute pour appeler connectionDidFinishLoading à chaque fois?) Il suffit de deviner. – user556623

Répondre

1

connection:didReceiveData: est appelée plusieurs fois. Vous devez prendre ces données et les ajouter aux données que vous avez reçues la dernière fois qu'elles ont été appelées. Ce n'est que lorsque vous recevez connectionDidFinishLoading que vous savez que le transfert est terminé et que vous avez toutes ces données.

Donc, juste parce que vous recevez des données ne signifie pas que c'est fait. Il est très probable que le serveur prenne autant de temps pour finaliser la demande ou d'autres problèmes quelque part dans votre code, comme un traitement excessif des données dans vos rappels retardant l'exécution du rappel final.

+0

Non, je mets une instruction NSLog à l'intérieur de la connexion: didReceiveData: méthode, je suis sûr qu'elle n'est appelée qu'une seule fois dans ce cas. – user556623

Questions connexes