Sauvegarde d'objet maison

olofolof Membre
15:32 modifié dans API AppKit #1
Salut tout le monde,

je fais un petit jeux et je gère les hi-scores. J'ai un objet (FGScores) qui contient un certains nombre de NSMutableArray qui elles mêmes contiennent des objets maison (FGScore).

Tout fonctionne. Mais pour l'instant, les meilleures scores ne sont pas sauvegardés.

Je pensais procéder de la manière suivante : Créer un fichier qui contient une archive de mon objet dans le bundle de l'application.
Est-ce une solution ? Ou est-ce que c'est pas du tout "Apple friendly" ?

De cette manière, les meilleures scores sont partagés entre les différents utilisateurs d'une même machine...


Merci pour vos précieux conseils !

Réponses

  • elfelf Membre
    15:32 modifié #2
    POurquoi ne pas enregistrer dans les user defaults en tant que NSData? tu archive en implémentant NSCoding dans FGScores et FGScore et depuis ton contrôlleur tu fais utilise NSArchiver / NSUnarchiver pour transformer FGScores en NSData que tu enregistre ensuite dans les user defaults (ou dans Application Support/TonApp si c'est pour tout les utilisateur, dans ce cas un fichier contenant des données binaires NSData devrais aller encore mieux)
  • olofolof Membre
    15:32 modifié #3
    Merci SeoxyS.

    J'ai vite fait le test, vu que j'avais déjà  implémenté NSCoding dans mes 2 classes. A la sauvegarde, j'obtient cette erreur :

    2005-11-13 11:45:49.261 Demineur[641] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<FGScores: 0x3a97c0>' of class 'FGScores'.

    Elle me parle pas beaucoup....
  • AliGatorAliGator Membre, Modérateur
    15:32 modifié #4
    Ben heu c'est normal.
    Dans un fichier plist (et pour les User Defaults c'est le cas puisque c'est stocké dans un plist) tu ne peux mettre que quelques types standards : NSString, NSNumber, NSDate, NSDictionary, NSDate, NSData, BOOL... et j'en oublie peut-être mais c'est les principaux.

    Il faut que tu convertises ton FGScores en NSData avant de le stocker dans les UserDefaults. Avec un NSArchiver, je suppose que c'est le plus simple et fait pour ça.
  • olofolof Membre
    15:32 modifié #5
    Oups, j'suis trop bête, en plus je l'ai déjà  fait dans un autre programme...

    Désolé  :o
  • elfelf Membre
    15:32 modifié #6
    Tien j'avais pourtant parlé des NSArchiver / NSUnarchiver... Il y a un très bon exemple dans Cocoa par la pratique
  • olofolof Membre
    15:32 modifié #7
    dans 1131978220:

    Tien j'avais pourtant parlé des NSArchiver / NSUnarchiver... Il y a un très bon exemple dans Cocoa par la pratique


    Merci de ne pas retourner le couteau dans la plaie  ::)

    J'ai juste eu un instant d'égarement  :p
  • olofolof Membre
    15:32 modifié #8
    Par contre, il y a quand même quelque chose qui me tracasse. Si j'ai bien compris, Cocoa gère les préférences de la manière suivante.
    On défini quelles sont les valeurs par défaut de chaque préférence et seules les valeurs différentes seront sauvegardées. C'est bien ça ?

    Je suis embêté pour donner une valeur par défaut à  mon object maison... Dès que j'essaye, y'a plus rien qui fonctionne...

    Comment faire pour écrire un fichier dans le répertoire '~/Library/Application Support/monApp/ ? Connaissant Apple, y'a sûrement quelque chose de prévu (que je n'ai pas trouvé, bien entendu...).
  • Eddy58Eddy58 Membre
    15:32 modifié #9
    dans 1131995777:

    Je suis embêté pour donner une valeur par défaut à  mon object maison... Dès que j'essaye, y'a plus rien qui fonctionne...

    Montre nous le code incriminé car là  ça ne nous en dit pas plus. ;)

    dans 1131995777:

    Comment faire pour écrire un fichier dans le répertoire '~/Library/Application Support/monApp/ ? Connaissant Apple, y'a sûrement quelque chose de prévu (que je n'ai pas trouvé, bien entendu...).

    Et bien à  ma connaissance, pas de miracle, c'est à  toi de mettre en paramètre dans la méthode d'écriture utilisée ton chemin de destination "~/Library/Application Support/monApp/", en ayant préalablement créé ton répertoire "monApp".
  • olofolof Membre
    novembre 2005 modifié #10
    Je suis en train de me prendre la tête grave... Non seulement, j'ai des problèmes avec la sauvegarde de mon objet maison, mais en plus, en créant un petit projet dans le but de vous le montrer, les préfs standards ne foncitonnent plus !!!

    Donc, si une bonne âme veut bien aider un gars perdu...

    Ci-joint, mon petit projet. Pour l'instant, c'est surtout l'object Controller qui est important. Le reste est là , mais c'est plus pour la question que j'aurai quand ce premier problème sera résolu... Donc, mon but est de gérer deux préférences, il s'agit des variables taille et difficulte. Valeur par défaut au niveau des préférences : 12.

    Si on lance le programme, on presse sur le premier bouton, ça met ces deux variables à  0. On presse le bouton Quitter, ça sauve les préfs (0 != 12 -> ça devrait être sauvé) dans un fichier a.a.Test. Chez moi, ce fichier ne se créé pas.

    J'ai déjà  peur d'apprendre quelle con***ie j'ai du faire....


    Merci !

    [Fichier joint supprimé par l'administrateur]
  • aranaudaranaud Membre
    novembre 2005 modifié #11
    - Si je lance l'application à  partir du finder, j'ai le message d'erreur ci dessous.
    - Si je lance l'application avec Xcode, elle ne quite plus.

    Le fichier "a.a.Test" est un fichier préférence (c'est le nom que tu lui a donné). Il est généré seulement quand l'application qui proprement.

    Rajout cette ligne pour quitter ton application

    <br />-(IBAction)quitter:(id)sender<br />{<br />	// Sauvegarde des préf<br />&nbsp; &nbsp; &nbsp; NSLog(@&quot;Sauvegarde des préfs : %d, %d&quot;,difficulte,taille);<br />	[[NSUserDefaults standardUserDefaults] setInteger:difficulte forKey:FGDifficulteKey];<br />	[[NSUserDefaults standardUserDefaults] setInteger:taille forKey:FGTailleGrilleKey];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; [NSApp terminate:self];&nbsp; &nbsp;  // ce qui faut rajouter pour quitter l&#39;application<br />/*<br />	NSData *vScoresData = [NSArchiver archivedDataWithRootObject:scores];<br />	[[NSUserDefaults standardUserDefaults] setObject:vScoresData forKey:FGScoresKey];<br />*/	<br />}<br />
    


    [Fichier joint supprimé par l'administrateur]
  • olofolof Membre
    15:32 modifié #12
    Voilà , je pensais bien que c'était bête... Je fais des tests depuis 1h en pensant que l'écriture du fichier de préf se faisait lorsqu'on changait des valeurs, pas seulement quand on quitte.... Merci !

    Quand au message que tu as en lançant depuis le Finder, j'ai en effet la même chose... Mais ça ne me dit pas grand chose !!!!

    Sinon, ma deuxième question, est la suivante. Dans le projet ci-joint (qui est le même qu'avant, saut que j'ai ajouté la ligne pour que l'appli quitte et dont j'ai viré les lignes en commentaire), j'essaye de sauvegarder en plus un objet FGScores, qui est en fait un tableau d'objets FGScore. Et là , plus rien de fonctionne. Le tableau de scores que j'initialise au lancement reste vide (premier bouton -> rien de s'affiche)...

    Une idée ????

    [Fichier joint supprimé par l'administrateur]
  • aranaudaranaud Membre
    15:32 modifié #13
    Le nombre de type d'object que tu peut sauvegarder dans un fichier plist est limité.

    Seul les objects de type : String, Dictionary, Array, Number, Boolean, Date, Data peuvent être sauvegardé sans transformation.

    Tu ne peux donc pas sauvegarder des objects FGScores tell quel.
  • olofolof Membre
    15:32 modifié #14
    Oui, je sais. C'est pour ça que je sauvegarde des objets NSData !!!
  • aranaudaranaud Membre
    15:32 modifié #15
    Si j'ai bien compris. Ton but est d'affiché une liste de score classé en fonction de la difficulté pour l'ensemble des utilisateurs de l'ordinateur.


    De cette manière, les meilleures scores sont partagés entre les différents utilisateurs d'une même machine...

    Enregistrer les scores dans les préférences utilisateurs ne me semble pas approprier.

    Pourquoi n'utilises tu pas une NSMutableArray par type de difficulté ?
  • olofolof Membre
    15:32 modifié #16
    En fait, le projet que j'ai mis en attache est une version light de ce que j'aimerais. Je l'ai simplifiée au max pour me concentrer sur la sauvegarde, qui ne fonctionne pas.
    Dans la version full, j'ai en effet plusieurs NSMutableArray.

    Quand au fait que les scores soient partagés par tous les utilisateurs, j'en parlais dans un de mes premiers posts, mais c'est pas une obligation. Pour commencer, j'aimerais sauvegarder ça dans les préférences, donc par utilisateur.
  • olofolof Membre
    15:32 modifié #17
    Youpie, en touchant presque rien (quoi exactement, je sais pas  :crackboom:-) et bien ça marche !!!

    :p :p :p :p :kicking: <3
  • aranaudaranaud Membre
    15:32 modifié #18
    Il ne te reste plus qu'a présenté le jeu dans son ensemble. :o
    Un jeu sûr quoi au faite ?
  • olofolof Membre
    15:32 modifié #19
    Oh, il est loin d'être présentable  ::) Et vu le temps que j'y passe, c'est pas pour demain !

    Il s'agit d'un "bête" démineur...

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