Archiver des tableaux & dictionnaires

muqaddarmuqaddar Administrateur
14:28 modifié dans API AppKit #1
Salut !

Voilà  2 méthodes qui permettent un archivage et la lecture d'un tableau :

-(BOOL)writeToFile:(NSString*)aPath ofType:(NSString*)type {<br />       return [_tab writeToFile:aPath atomically:YES];<br />}<br /><br />-(BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type {<br />   [_tab autorelease];<br />       _tab = [[NSMutableArray alloc] initWithContentsOfFile:(NSString*)aPath];<br />  return YES;<br />}


Je souhaiterai savoir maintenant comment archiver des tableaux multiples dans un seul fichier, ou bien encore archiver des dictionnaires, la façon de les concaténer en quelque sorte... merci

Réponses

  • ClicCoolClicCool Membre
    14:28 modifié #2
    Pour ce qui est des dictionaires, writeToFile: atomically: et initWithContentOfFile: ont une utilisation similaire aux méthodes de NSArray que tu utilises.

    Quand à  mettre plusieurs tableaux et dictionaires dans un même fichier, y'a rien de plus simple.
    Il suffit de mettre tout ton fourbi dans un dictionaire (ou un tableau) racine.

    Par exemple tu crées un dictionnaire avec comme contenu: le tableau de mes groupes, le  tableau des Sites, la liste de mes courses, le dictionaire du glossaire OC etc ...
    (Tu attribus un mot clef de ton cru à  chaque élements bien sur)
    Et à  l'ouverture, tu retrouves dans ton dico racine touts tes chers tableaux et dicos etc... sagement rangés avec leur clef d'accès.

    Comme objet racine, un tableau fait aussi l'affaire, mais je ne vois pas ici l'intérrêt d'une collection ordonnée et j'aime bien l'usage des clefs qui est plus explicite que des indices.
  • muqaddarmuqaddar Administrateur
    14:28 modifié #3
    Merci ClicCool. Même en travaillant, tu trouves le moyen d'être là  ;-)

    Je vais essayer de créer ça. A tout' ;)
  • muqaddarmuqaddar Administrateur
    14:28 modifié #4
    Yop, de retour.

    J'arrive pas à  déclarer mes clés à  la volée !
    Avant de faire : [dicArchivage setObject: _groups forKey: groupsKey];

    Tu peux me metter sur la voie amigo ?
  • ClicCoolClicCool Membre
    14:28 modifié #5
    transmets une NSString comme clef
    [dicArchivage setObject: _groups forKey: @&quot;groupsKey&quot;];<br />
    
    :)
  • 14:28 modifié #6
    dans 1094820917:

    transmets une NSString comme clef

    On peut transmettre chose? ;)

    Je ne sais pas comment tes données sont structurées, mais si la clé de cause des problème, tu les mets dans un tableau. Et au chargement de ton prog, tu recharges ton tableau dans le même ordre (à  supposer que le type d'élément et le nombre ne change pas).
  • muqaddarmuqaddar Administrateur
    14:28 modifié #7
    Oui c'est ce que j'avais fait au début mais il me jette en me disant qu'il connait pas la clé...

    Ah plus maintenant... bizarre.  O0
  • muqaddarmuqaddar Administrateur
    14:28 modifié #8
    A chaque fois je suis grillé de 5 secondes dans mes réponses ;)
  • 14:28 modifié #9
    Désolé :P
  • TiffTiff Membre
    14:28 modifié #10
    C'est quoi l'avantage du _ devant les noms ?
    _groups


    J'ai déjà  vu ça dans un tuto. Je trouve ça moche.
    ça me fait penser à  un programme écrit en C.  ::)
  • 14:28 modifié #11
    On utilise souvent ce symbole pour distinguer les variables d'instance des variables créées  dans une méthode ou les variables "argument".
  • ClicCoolClicCool Membre
    14:28 modifié #12
    Désole Arldon mais là  je ne suis pas d'accord, :( (ça change un peu ;) )
    il me semble que le début des noms par un souligné marque les variable Privées.

    Du reste dans le KVO et leur usage par les bindings, la règle est que si le binding ne trouve pas les accesseurs attendus, il agit directement sur la variable SAUF si elle est marquée comme privée par le underscore.
  • TiffTiff Membre
    14:28 modifié #13
    Oui, je comprends, mais il n'y a pas un moyen plus explicite ?
    tempGroups, someGroups, comme dans les accesseurs :
    -(float)setGroup:(float)aGroup {<br />group = aGroup ; }
    


    [EDIT]
    Si j'ai bien compris, dans l'exemple ci-dessus, aGroup est une variable argument.
  • odjauodjau Membre
    septembre 2004 modifié #14
    [question bête] c'est quoi une variable "argument" ?[/question bête]
    peut-être que j'utilise déjà  sans le savoir  ::)

    [edit] et une variable privée ???
  • TiffTiff Membre
    14:28 modifié #15
    dans 1094830968:

    underscore

    Je traduis : underscore = _ (j'ai mis deux min avant de comprendre)
  • TiffTiff Membre
    14:28 modifié #16
    Bon alors, variable privée ou variable argument ou variable temporaire ?
  • ClicCoolClicCool Membre
    14:28 modifié #17
    dans 1094831328:

    dans 1094830968:

    underscore

    Je traduis : underscore = _ (j'ai mis deux min avant de comprendre)

    Sory euh pardon désolé  ;D
  • muqaddarmuqaddar Administrateur
    14:28 modifié #18
    PAS MOI. :)
    Le underscore _ est là  pour dire que c'est un tableau. Enfin, moi je fais comme ça et c'est cool.
  • BruBru Membre
    14:28 modifié #19
    dans 1094830968:
    il me semble que le début des noms par un souligné marque les variable Privées.


    C'est vrai.

    Mais, il ne faut pas parler de variables privées au sens Objective-C (qui elles sont marquées par la directive @private). Ce sont plutôt des variables "cachées" ou non documentées. Elles restent accessibles aux autres classes (si elles sont @public), mais leur emploi n'est normalement pas permis.

    Il en va de même pour les méthodes commençant aussi par _ .

    Pour la petite histoire, beaucoup de méthodes dans les classes cocoa commencent par _ . Bien sûr, Apple ne fournit pas de doc dessus : ce sont les fameuses "undocumented" qu'on peut utiliser, mais à  ses risques et périls.

    .
  • Eddy58Eddy58 Membre
    14:28 modifié #20
    Ha oui ? Et ou trouve t-on ces méthodes si elles ne sont pas documentées ?  ???
  • BruBru Membre
    14:28 modifié #21
    dans 1095592813:
    Ha oui ? Et ou trouve t-on ces méthodes si elles ne sont pas documentées ?  ???


    Des utilitaires comme otool ou class-dump permettent de les trouver...

    Par exemple, class-dump permet de trouver ça dans la classe NSWindow :
    + (void)_minimizeAll;
    


    _minimizeAll est une méthode de classe "undocumented" qui permet de miniaturiser d'un coup toutes les fenêtres d'une appli (en fait cette méthode est liée au menu "Fenêtre", article "Placer dans le dock" tout en appuyant ALT).

    Le problème des "undocumented" est que bien sûr Apple peut du jour au lendemin modifier le comportement de la méthode, voire la supprimer sans rien dire...
    Toutefois, beaucoup de "undocumented" deviennent "documented" (elles perdent alors le _) au fur et à  mesure des versions de OS X.

    .
  • Eddy58Eddy58 Membre
    14:28 modifié #22
    Ok.....c'est intéressant, ca permet de se faire une idée sur l'amélioration des APIs dans de futures versions d'OS X, voire si Apple va décider d'intégrer ces méthodes "bêta" ou pas. Dans tout les cas il est vrai qu'il ne vaut mieux pas se servir de ces méthodes non documentées pour développer (juste à  la limite pour essayer et voir le resultat de ces méthodes).
  • mpergandmpergand Membre
    septembre 2004 modifié #23
    Ouais, sauf si tu n'as pas d'autre choix que de les utiliser! Comme pour permettre l'affichage des fichiers invisibles dans un openPanel sous Panther:

    [[openPanel _navView ]setShowsHiddenFiles:YES];

    Merci encore à  la personne ( l0wc0der ???) qui ma donné l'astuce sur un autre forum
  • muqaddarmuqaddar Administrateur
    14:28 modifié #24
    Bon, j'en reviens à  mes moutons.  ;)

    En fait, je ne veux pas concaténer des tableaux dans un dictionnaire, mais des dictionnaires dans un dictionnaire. Seulement mon code d'archivage est dans ma classe controller. Or, je ne vois pas comment jongler avec les dictionnaires qui sont chacun dans leur propre classe, à  l'intérieur de ma classe controlleur... Comment mon contrôleur va s'en sortir ?

    Me fais-je comprendre ?  :P :P
  • ClicCoolClicCool Membre
    14:28 modifié #25
    Tu as donc un controller qui est responsable de la lecture et écriture sur disque.
    Et différentes classes responsables chacunes de leur dictionnaires c'est ça ?

    Ton contrôleur a des pointeurs sur les classes en question ?

    Dans ce cas, chaque classe doit aussi implémenter une méthode du genre: - (NSDico*) monDico et - (void)setMonDico: (NSDico*)leDico.

    Au moment de l'archivage ton contrôleur demande à  chaques classes de renvoyer leur dico, et les range sagement dans un dico racine avec une clef identifiant clairement de quelle classe vient ce dico. Ensuite il sauvegarde le dico avec un writeToFile.

    A la lecture c'est l'inverse, il lit le dico racine, et clef par clef il récupère les dicos de tes classes qu'il leur envoie avec la méthode setMonDico de chaque classe.

    ça répond à  tes interrogation ?  :-\
  • Eddy58Eddy58 Membre
    14:28 modifié #26
    dans 1095616462:

    Ouais, sauf si tu n'as pas d'autre choix que de les utiliser! Comme pour permettre l'affichage des fichiers invisibles dans un openPanel sous Panther:

    [[openPanel _navView ]setShowsHiddenFiles:YES];

    Merci encore à  la personne ( l0wc0der ???) qui ma donné l'astuce sur un autre forum


    Oui tout à  fait, ça pour être pratique c'est pratique, mais le risque est toujours là  : lorque Tiger sortira, soit la méthode setShowsHiddenFiles: est officialisée, soit elle reste cachée, soit elle est virée....et j'espère pour toi qu'elle ne sera pas virée  :-\

    @Oxitan : Désolé d'interférer dans ton thread ! :)
Connectez-vous ou Inscrivez-vous pour répondre.