Désarchiver/Archiver l'appDelegate
Flo
Membre
Bonjour à tous,
Tout est à peu près dans le titre, je n'arrive pas à faire en sorte que mon AppDelegate soit initialisé à partir d'une archive.
Comment dois-je faire ? Je voudrais que mon application teste si le fichier de données est présent, si oui initialiser l'AppDelegate à partir d'un fichier, sinon faire son initialisation classique.
L'appDelegate implémente :
Est-ce correct de faire ainsi ? :
ça parait un peu cochon... non ?
Tout est à peu près dans le titre, je n'arrive pas à faire en sorte que mon AppDelegate soit initialisé à partir d'une archive.
Comment dois-je faire ? Je voudrais que mon application teste si le fichier de données est présent, si oui initialiser l'AppDelegate à partir d'un fichier, sinon faire son initialisation classique.
L'appDelegate implémente :
<br /> - (id) initWithCoder: (NSCoder *)aCoder;<br />- (void) encodeWithCoder: (NSCoder *)aCoder;<br />
Est-ce correct de faire ainsi ? :
<br /> - (id) init<br />{<br />Â Â if ( "fichier existe")<br />Â Â {<br />Â Â Â Â "récupérer l'archive et faire un self = [NSKeyedUnarchiver unarchiveObjectWithFile: appDataFile];<br />Â Â Â }<br />Â Â Â else<br />Â Â Â Â self =Â [super init];<br />}<br />
ça parait un peu cochon... non ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est au dessus qu'il faut le gérer...
Et en plus d'une faut pas oublier le "retain" après "unarchiveObjectWithFile" (objet auto-released) ; de deux, faut pas oublier le @try @catch (si le fichier est mal formé, ça balance une exception).
Ben ouais c'est bien ce que je pensais, le truc c'est que l'AppDelegate est instancié dans un nib alors comment faire ?
Les objets dans les .nib sont instanciés avec "initWithCoder", et c'est déjà un archivage.
Donc il faut le modifier via le awakeFromNib...
Sa veut dire qu'à un moment dans awakeFromNib j'ai un truc comme ça ? :
C'est pas un peu barbare sachant qu'il y a déjà un self = [super init]; (par initWithCoder:) qui a été fait ?
Variable par variable avec les accesseurs...
Oui bien sur, j'ai oublié de bouger la ligne de commentaire ;D
Merci !
Une dernière petite question, si je fais ça plutôt dans un thread et dans la méthode applicationDidFinishLaunching: ça change pas grand chose non ?
En général, soit notre appli est basée sur un document, soit on stocke quelques données dans les préférences. Dans les deux cas, on va maintenir des objets de la couche modèle, et on fera leur désarchivage dans une méthode -initWithCoder.
Flo, j'imagine bien qu'il y a une logique, mais je crois que tu t'y prends mal.
Je voudrai bien moi pouvoir l'initialiser avec initWithCoder mais le problème c'est qu'il est dur de se placer un niveau au dessus vu que l'appDelegate est initialisé dans un nib. J'ai essayé mais c'est tout crade.
Au final la solution de shlum est pas si bizarre non ? (Charger tous les noeuds fils dans awakeFromNib ou applicationDidFinishLaunching:)
Crée un variable pour les contenir et le tour est joué.
Je rejoins Céroce sur l'utilisation curieuse de AppDelegate, j'ai jamais de variable d'instance dans le AppDelagate, à part des Outlets.
Bon, j'en connais qui font bien des trucs du genre [NSApp delegate] maVariable (sorry, private joke)
Ben ça dépends de ce qu'on veut faire non ? Si on prends un projet core data par exemple on a bien le managedObjectContext etc... en variables d'instance de l'AppDelegate...
Bon je suis daccord, l'archiver c'est peut-être pas une bonne idée, mais je vais faire autrement du coup
Exact, tu as raison
Perso, j'utilise pas coreData, ça doit être pour ça ...