2010-02-09 4 views
4

J'ai un NSData que je voudrais lire en tant que NSInputStream. De cette façon, je peux avoir une API cohérente pour le traitement des fichiers et des données en mémoire. Dans le cadre du traitement, je voudrais m'assurer que le flux commence avec un certain nombre d'octets (si ce n'est pas le cas, je dois le traiter différemment). Je voudrais éviter de lire un fichier entier en mémoire s'il est du mauvais type. Donc, je suis à la recherche d'un moyen de rembobiner le flux, ou un moyen de "jeter un coup d'œil" sur les prochains octets sans déplacer le pointeur de lecture. S'il s'agit d'un NSInputStream créé avec une URL, je peux utiliser setProperty: forKey: sur NSStreamFileCurrentOffsetKey, mais bizarrement cela ne fonctionne pas sur un NSInputStream créé à partir d'un NSData (même si vous présumeriez que cela aurait été encore plus facile à implémenter que la version du fichier). Je ne peux pas fermer et rouvrir la vapeur pour réinitialiser le pointeur d'entrée non plus (ceci n'est explicitement pas autorisé par NSStream).Rembobiner un NSInputStream basé sur un NSData

Je peux retravailler ce problème en utilisant une interface NSData-only et -initWithContentsOfMappedFile, mais je préfère rester avec l'approche NSStream si je le peux.

Répondre

1

Je pense que je ne comprends pas quelque chose ici. Un NSInputStream peut prendre des données à partir de trois emplacements: un socket, un objet NSData ou un fichier. Vous n'avez pas dit que vous voulez utiliser une socket, ce qui laisse les deux autres comme sources de données. En outre, les documents pour NSStream indiquent que seuls les flux basés sur des fichiers peuvent être recherchés. (NSStream, vue d'ensemble, 3ème paragraphe)

Étant donné cela, je pense qu'un objet NSData serait un meilleur choix. Un objet NSData gérera à la fois les fichiers et les octets (ce que je pense être ce que vous entendez par données en mémoire).

Mais vous considérez cela et dites que vous préférez rester avec les flux. Y a-t-il d'autres considérations ici?

(Éditer) Désolé, j'aurais dû en faire une vraie réponse. Ma réponse au problème que vous avez décrit est que l'utilisation de NSData est vraiment la bonne chose à faire.

Si vous préférez une réponse différente, veuillez donner plus de détails.

+1

Avez-vous un lien vers la référence seuls les flux basés sur des fichiers peuvent être recherchés? Je n'avais pas été capable de trouver ça jusque là. Cela semble fou, car il est plus facile de chercher un NSData qu'un fichier (ne pas dire que ce n'est pas vrai, juste que c'est fou). Nous avons réécrit en utilisant un NSData mappé en mémoire, mais il n'est pas encore clair si cela donne les performances que nous aimerions sur Mac et iPhone (nous testons actuellement la façon dont la mémoire mappée NSData fonctionne sur l'iPhone). Le point clé est "Je voudrais éviter de lire un fichier entier en mémoire s'il est du mauvais type." –

+1

Salut Rob, La référence se trouve dans la parenthèse ci-dessus, quoique de manière abrégée. Document de référence d'Apple pour NSStream, section Aperçu, troisième paragraphe. Qui dit: «Par défaut, les instances de NSStream qui ne sont pas basées sur des fichiers sont des flux unidirectionnels non recherchés (bien que des sous-classes personnalisées soient possibles.) Une fois les données fournies ou consommées, les données ne peuvent pas être extraites du flux. " Je suis d'accord que cela semble fou. Mais, c'est ce que le docteur dit. –

+0

AFAICT, les docs sont faux - vous ne pouvez pas non plus chercher dans un flux basé sur des fichiers (il n'y a pas de point de terminaison API pour cela, et le guide de programmation ne mentionne plus jamais cette possibilité). Il me semble que c'est une fonctionnalité qu'ils ont oubliée ou supprimée. – Adam

1

Vous pouvez en effet rechercher dans un nsInputStream qui est en train de lire un fichier:

BOOL samplePositionAccepted = [iStream setProperty: [NSNumber numberWithUnsignedLong: samplePosition] forKey: NSStreamFileCurrentOffsetKey];

Je ne suis pas sûr si cela fonctionne pour NSData cependant. (Désolé, je n'ai pas assez de points pour écrire un commentaire encore ...)

(Oops désolé, n'a pas vu que vous avez déjà essayé cela ...)

Questions connexes