2011-09-09 4 views
2

Contexte: Au cours du processus de négociation, mon iOS app apprend les capacités du serveur parEst-ce que didReceiveResponse est garanti pour précéder connectionDidFinishLoading?

  1. La vérification des informations d'en-tête dans didReceiveResponse

    ET

  2. Parsing sa réponse XML en connectionDidFinishLoading

Énoncé du problème: Puisque le rappel # 1 précède le numéro 2, je stocke la chaîne de version dans didReceiveResponse et la vérifie plus tard dans connectionDidFinishLoading lorsque la réponse est disponible.

Cela fonctionne heureusement bien jusqu'à présent parce que # 1 précède # 2. Mais cet ordre est-il toujours garanti par le réseau/iOS?

Répondre

2

Selon la documentation:

Zero or more connection:didReceiveResponse: messages will be sent to the delegate before receiving a connection:didReceiveData: message. The only case where connection:didReceiveResponse: is not sent to a delegate is when the protocol implementation encounters an error before a response could be created. Zero or more connection:didReceiveData: messages will be sent before any of the following messages are sent to the delegate: connection:willCacheResponse:, connectionDidFinishLoading:, connection:didFailWithError:.

Donc, à moins qu'il ya une erreur, vous pouvez garantir que vous aurez un didReceiveResponse avant d'obtenir un connectionDidFinishLoading.

+1

Cela peut être une question boiteuse, mais ce qui constitue une erreur avant que la réponse est créé: > Le seul cas où ce message n'est pas envoyé au délégué est lorsque la mise en œuvre du protocole rencontre une erreur avant qu'une réponse pourrait être créée – cynistersix

0

Oui, bien sûr. Dans didReceiveResponse vous pouvez vérifier NSURLResponse et si quelque chose ne va pas, vous pouvez simplement arrêter le téléchargement. Donc, connectionDidFinishLoading sera appelée seulement après que vous avez vérifié la réponse.

3

De NSURLCOnnection Reference:

Zero or more connection:didReceiveResponse: messages will be sent 

to the delegate before receiving a connection:didReceiveData: message. The only case where connection:didReceiveResponse: is not sent to a delegate is when the protocol implementation encounters an error before a response could be created.

Zero or more connection:didReceiveData: messages will be sent 

before any of the following messages are sent to the delegate: connection:willCacheResponse:, connectionDidFinishLoading:, connection:didFailWithError:.

Zero or one connection:willCacheResponse: messages will be sent to 

the delegate after connection:didReceiveData: is sent but before a connectionDidFinishLoading: message is sent.

Ainsi, il ne se produira pas seulement s'il y a une erreur avant de créer la réponse.

+0

Pourquoi répétez-vous @Malcolm Box réponse? – Nekto

+1

J'apprécie votre inquiétude Nekto, mais je ne l'ai pas fait intentionnellement. Je suppose que nous avons posté les réponses à un moment similaire. – Madhu

+0

Je vous vois posté votre réponse 2 minutes plus tard. Donc ... – Nekto

Questions connexes