Décoder un fichier créé avec NSDocument, sous iPhone OS.

Nebuchad34Nebuchad34 Membre
Bonjour !

Sur l'appli Mac je crée mes fichiers de documents à  partir de la classe NSDocument et de sa methode :
-- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError

C'est lui qui s'occupe d'écrire le fichier en utilisant le NSData ainsi généré.

Sur l'iPhone j'aimerais pouvoir lire ces fichiers.
Si je fais un simple [NSData dataWithContentsOfFile:MyFilePath];
L'objet NSData que je récupère n'est en fait pas le même que celui que me donne la classe NSDocument via :
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError

Dans le projet sur le Mac, j'ai sélectionné "XML" comme "Store Type" pour les documents générés par ma sous-classe de NSDocument.
La question, c'est comment récupérer, sous iPhone OS, le même NSData que celui avec lequel je travaille dans les méthodes de NSDocument mais à  partir de mon fichier ?


Merci.

Réponses

  • CéroceCéroce Membre, Modérateur
    avril 2010 modifié #2
    dans 1271095622:

    Dans le projet sur le Mac, j'ai sélectionné "XML" comme "Store Type" pour les documents générés par ma sous-classe de NSDocument.

    Ce réglage n'est utilisé que pour le choix du stockage des documents CoreData (d'où les choix XML, binaire et SQLite).

    Si tu as bien utilisé le NSKeyArchiver, tu devrais pouvoir lire les NSData sur l'iPhone sans problème.
    Par contre, note bien que l'archivage, par principe, nécessite que la hiérarchie des objets soit la même. En effet, l'archivage consiste à  parcourir la hiérarchie des objets et enregistrer les valeurs de leurs propriétés et les objets auxquels ils sont attachés. Si ce n'est pas le cas, je ne sais pas trop comment NSUnarchiver se débrouille.

    La couche modèle est elle organisée de la même façon sur Mac et iPhone ?
  • Nebuchad34Nebuchad34 Membre
    13:11 modifié #3
    je partage ma couche modèle entre l'iphone et le mac. pas de problème de ce coté là 

    Voilà  comment se présente ma méthode :


    - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError<br />{<br />NSMutableDictionary *save = [[NSMutableDictionary alloc] init];<br />	<br />	[save setObject:playersArray forKey:@&quot;playersArray&quot;];<br />	[save setObject:roundsArray forKey:@&quot;roundsArray&quot;];<br />	[save setObject:chipsArray forKey:@&quot;chipsArray&quot;];<br />	//etc etc...<br /><br />	return [NSKeyedArchiver archivedDataWithRootObject:[save autorelease]];<br />}
    


    A priori, en ayant mon fichier .tournament sur l'iphone, je devrais pouvoir faire :
    NSData *data = [NSData dataWithContentsOfFile:aTournamentFilePath];

    et faire ensuite:
    <br />	NSMutableDictionary *savedInfos = [NSKeyedUnarchiver unarchiveObjectWithData:data];<br /><br />		[self.playersArray addObjectsFromArray:[savedInfos objectForKey:@&quot;playersArray&quot;]];<br />		[self.roundsArray addObjectsFromArray:[savedInfos objectForKey:@&quot;roundsArray&quot;]];<br />		[self.chipsArray addObjectsFromArray:[savedInfos objectForKey:@&quot;chipsArray&quot;]];<br />
    


    Mais ça ne marche pas. J'ai fait un simple log sur [playersArray count] et il me retourne 0, alors que j'ai bien des joueurs enregistrés dans ce tournoi normalement.
  • Nebuchad34Nebuchad34 Membre
    13:11 modifié #4
    Hallelujah !
    ça marche.
    En fait, j'avais oublié un NSColor. Je pensais pourtant tous les avoir remplacé par mon "NSUIColor", mais j'en avait oublié un.
Connectez-vous ou Inscrivez-vous pour répondre.