Archivage d'un tableau de classe

CyberbobCyberbob Membre
02:27 modifié dans API AppKit #1
Bonjour à  tous..

J'ai regardé ce qu'il a été dis sur le forum, et je n'ai pu trouver une explication complète.

Voila, j'ai une classe , nommée cQueue, qui contient des strings et un tableau de classe cAction.

Je souhaiterais donc archiver un NSMutableArray de cQueue. J'ai bien compris que je ne pouvais pas stocker des types autres que ceux stockables dans un plist.

Mais, je n'ai pas trouvé de façon clair, quel étaient les méthodes à  surcharger pour que tout ceci fonctionne. J'arrive a enregistrer mon tableau de cQueue, mais je ne pense pas utiliser la bonne méthode. Est ce que qq'un pourrait m'expliquer par l'exemple le schéma de fonctionnement pour charger et sauvegarder mon tableau ?

Merci bcp !

Réponses

  • ChachaChacha Membre
    02:27 modifié #2
    Salut,

    Regarde du côté du protocole NSCoding, qui fait surcharger encodeWithCoder: et initWithCoder:
    ça permet d'utiliser la sérialisation des NSArchiver/NSUnarchiver.

    +
    Chacha
  • CyberbobCyberbob Membre
    02:27 modifié #3
    C'est ce que j'ai regardé !

    Je te montre mon code...

    dans ma classe cQueue, j'ai donc

    <br />-(void)encodeWithCoder:(NSCoder*)coder {<br />	[coder encodeObject:name];<br />	[coder encodeObject:path_InPS];<br />}<br /><br />- (id)initWithCoder:(NSCoder *)coder<br />{<br />	if (self = [super init]) {<br />		name = [coder decodeObject];<br />		path_InPS = [coder decodeObject];<br />	}<br />	return self;<br />}<br />
    


    Ainsi, dans mon autre classe, celle qui contient le tableau de cQueue je fais :
    <br />[dataToSave addObject:[NSArchiver archivedDataWithRootObject:aQueue]];<br />[dataToSave writeToFile:@&quot;/test.plist&quot; atomically:YES];<br />
    



    Et pour le chargement, j'ai essayé ça, mais ça ne marche pas...
    arrayQueue = [[NSMutableArray alloc] initWithContentsOfFile:@&quot;/test.plist&quot;];
    



  • ChachaChacha Membre
    juin 2006 modifié #4
    dans 1149691091:

    Je te montre mon code...

    Ok, quelques erreurs, donc :

    <br />name = [coder decodeObject];<br />path_InPS = [coder decodeObject];<br />
    

    Non, la gestion de la mémoire nous dit plutôt de faire :
    <br />name = [[coder decodeObject] retain];<br />path_InPS = [[coder decodeObject] retain];<br />[/code]<br /><br />[quote]<br />Ainsi, dans mon autre classe, celle qui contient le tableau de cQueue je fais : <br />[code]<br />[dataToSave addObject:[NSArchiver archivedDataWithRootObject:aQueue]];<br />[dataToSave writeToFile:@&quot;/test.plist&quot; atomically:YES];<br />
    

    [/quote]
    Quel est le type de l'objet dataToSave ? Si c'est un NSData, il ne connaà®t pas addObject !


    Et pour le chargement, j'ai essayé ça, mais ça ne marche pas...
    arrayQueue = [[NSMutableArray alloc] initWithContentsOfFile:@&quot;/test.plist&quot;];
    


    Ben là , non, il n'y a aucune décodage de fait, tu récupères juste un NSData depuis le fichier.

    Je pense que tu fais des confusions entre ce qu'il faut sauver, le NSData intermédiaire, et les méthodes d'encodage.
    -le protocole NSCoding permet de transformer n'importe quel objet en NSData, grace à  NSArchiver, tandis que NSUnarchiver va recréer l'objet à  partir du NSData
    -pour sauvegarder un NSData, writeToFile fonctionne très bien
    -les objets des plist de Cocoa (NSString, NSData, NSArray, NSDictionary) répondent au protocole NSCoding, ce qui fait que si on leur applique  un NSArchiver, ils vont transmettre la sérialisation en cascade à  leur contenu. Donc si un NSArray contient un objet quelconque répondant à  NSCoding, il suffit d'encoder le NSArray.
    -pour sauvegarder des objets de plist, il existe effectivement des méthodes court-circuitant les appels à  NSArchiver, mais tu ne peux les appliquer dans ton cas.

    +
    Chacha
  • CyberbobCyberbob Membre
    02:27 modifié #5
    dataToSave était du type NSMutableArray.. et c'est cet Array que je sauvegardais..

    En revanche, je ne sais pas comment lire chaque data de ma classe pour les remettre ensuite dans une array, lors de mon chargement.

    Ok pour le retain, je viens aussi de le voir sur le site d'apple.
  • ChachaChacha Membre
    02:27 modifié #6
    dans 1149692654:

    En revanche, je ne sais pas comment lire chaque data de ma classe pour les remettre ensuite dans une array, lors de mon chargement.

    Ben justement, tu n'as pas besoin de le faire !
    Supposons que tu aies un NSArray A, contenant des objets à  toi : O1, O2... implémentant NSCoding.
    Il te suffit  de faire :
    <br />//sauvegarde<br />NSData* dataToSave = [NSArchiver archivedDataWithRootObject:A]; //O1, O2... sont automatiquement sérialisés<br />[dataToSave writeToFile:...];<br /><br />//chargement<br />NSData* data = [NSData dataWithContentsOfFile...];<br />NSArray* decodedArray = [NSUnarchiver unarchiveObjectWithData:data]; //contient O1, O2... automatiquement décodés<br /><br />
    


    +
    Chacha
  • CyberbobCyberbob Membre
    02:27 modifié #7
    Chacha tu es mon maitre ! Franchement je n'était pas très très loin, mais je n'y serais pas arrivé sans ton aide. Je te remercie beaucoup. Ca fait toujours plaisir d'avoir un soutien.

    Bref, je suis content, vive le Cocoa, même si en Java c'est plus facile lol ! ;)
  • ChachaChacha Membre
    02:27 modifié #8
    dans 1149698472:

    Chacha tu es mon maitre !

    Et mon maà®tre étant Bru, je te laisse en déduire la conséquence par transitivité !


    Franchement je n'était pas très très loin

    Absolument ! C'est pour ça que j'ai d'abord simplement essayé de clarifier au lieu de donner la réponse. Bravo à  toi pour avoir bien cerné les solutions tout seul.


    Bref, je suis content, vive le Cocoa, même si en Java c'est plus facile lol ! ;)

    Argh!  Le mot Java me hérisse le poil !

    +
    Chacha
Connectez-vous ou Inscrivez-vous pour répondre.