2015-07-26 1 views
1

J'utilise la méthode connection:didReceiveData: de NSURLConnection pour intercepter les données entrantes, envoyées via l'API de streaming Twitter. Parfois, je remarque que les données, telles que le dictionnaire JSON d'un tweet, sont incomplètes et seront généralement terminées dans l'appel suivant à didReceiveData:. Je vais bien attendre et ajouter si les données actuelles sont incomplètes, mais j'ai besoin d'un moyen de déterminer cela. Y a-t-il quelque chose à la fin de NSData que je devrais attendre pour signaler son achèvement? Et en écrivant cela, j'ai aussi pensé à la possibilité que je puisse avoir un ensemble de données partiellement reçu, et avant qu'il ne soit terminé, peut-être parce que la connexion a été temporairement perdue ou annulée, je reçois le début de quelques nouvelles données, complètes. Ou je pourrais recevoir des données incomplètes dont je n'ai pas le début. Existe-t-il un moyen pour moi de déterminer si je devrais ajouter ces données à mes données existantes précédentes, que ce soit lié?Détermine si le message reçu via NSURLConnection est complet?

EDIT: En réponse à la première réponse.

Lorsque vous utilisez l'API de Twitter Streaming, avec un timeoutInterval de -1, connectionDidFinishLoading: est jamais appelé (ni est connection:didFailWithError:). connection:didReceiveResponse: est appelée, en tant que première méthode de délégué à appeler. L'exploitation du bois donne ceci:

connection did receive response: <NSHTTPURLResponse: 0x17402b120> { URL: https://userstream.twitter.com/1.1/user.json } { status code: 200, headers { 
    Connection = close; 
    "Content-Encoding" = gzip; 
    "Content-Type" = "application/json"; 
    Date = "Sun, 26 Jul 2015 11:48:50 GMT"; 
    Server = tsa; 
    "Transfer-Encoding" = Identity; 
    "x-connection-hash" = d2d3baf7a03549b07abcd9410de47ccd; 
} } 

Fait intéressant, cette fois cela a été suivi d'un journal des « amis », qui ressemble à une version plus longue de ce (la plupart des ID supprimés, et les ID modifiés):

connection did receive data: { 
    "friends" : [ 
    189565864, 
    224868111, 
    89670443 
    ] 
} 

Le journal "friends" arrive assez souvent. Mais suite à cela est venu des données incomplètes concernant un tweet. C'était la dernière partie de ces données - elle était complète jusqu'à la fin, mais n'incluait pas le début des données. Le début des données n'a jamais été reçu auparavant.

Répondre

2

Vous devez implémenter connectionDidFinishLoading(_ connection: NSURLConnection) introduit par NSURLConnectionDataDelegate pour vérifier que la connexion a terminé le chargement avec succès. Cette méthode est appelée après toutes les données du flux ont été envoyées.

Si une erreur se produit lors du transfert des données, connection(_:didFailWithError:) est appelé de sorte que vous pouvez effacer tout votre objet NSData reçu et vérifiez la error pourquoi il a échoué.

+0

J'ai édité mon poste avec plus d'informations concernant mon problème. Il semble que 'connectionDidFinishLoading' est appelé avant de recevoir des données en continu. – Andrew