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.
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." –
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. –
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