2013-05-17 2 views
1

Je tente de créer un analyseur html en streaming avec libxml2 dans Objective-C. J'ai un NSURLConnection qui télécharge les données, et j'ai créé dans NSInputStream et NSOutputstream avec CFStreamCreateBoundPair avec une petite taille de mémoire tampon de 10 octets. Comme les données sont reçues de la connexion NSURLConnection je l'écris au flux de sortie. Il apparaît lorsque la quantité de données reçues est supérieure à la taille de la mémoire tampon, les données restantes sont perdues. Est-ce censé se produire? D'après ce que j'ai compris, je pensais que les données seraient mises en file d'attente et écrites en morceaux de la taille du tampon dans le flux d'entrée.Les flux CFStreamCreateBoundPair perdent des données avec une petite taille de buffer

CFStreamCreateBoundPair Reference

Répondre

1

Vous devez vous assurer que toutes les données du morceau reçu est finalement écrit dans le flux.

Vous pouvez le faire avec une simple boucle dans la méthode déléguée dans laquelle vous écrivez en continu une partie du bloc reçu jusqu'à ce qu'il soit complètement écrit dans le flux. Toutefois, cela peut provoquer le blocage indéterminé du thread sur lequel le délégué s'exécute: si le consommateur n'est pas prêt à consommer plus d'octets, le flux de sortie se bloquera lors de la tentative d'écriture de plus de données.

Vous pouvez également envoyer l'objet NSData de manière asynchrone à une file d'attente où un bloc effectue la boucle et écrit toutes les données avant la fin. Cependant, cela peut entraîner un manque de mémoire de votre système si le consommateur est lent et que les données sont volumineuses - puisque toutes les données NSData se trouvent dans la file d'attente de répartition jusqu'à la fin du bloc.

Les deux approches ont des avantages et des inconvénients. J'ai tendance à préférer le premier, car il n'y a pas de problème de mémoire et la connexion va tamponner les octets entrants jusqu'à une certaine limite supérieure de toute façon - avant qu'il arrête de reconnaître plus d'octets.

Questions connexes